【问题标题】:Add missing Header values添加缺少的标题值
【发布时间】:2018-04-22 06:27:16
【问题描述】:

我使用 MVC4 Web API 编写了一个 RESTful Web 服务。调用我的 Web 服务的客户端之一正在发布 XML 正文,但得到的是 JSON 响应。

我了解到客户端没有设置 Content-type: application/xml 或 Accept: application/xml 的 header 值。

调用我的网络服务的客户是世界上最大的公司之一,拒绝添加所需的标头值。

所以我的问题是,如何添加客户端未发送的缺失标头值,以便我的 Web 服务可以返回 XML 响应?

或者我如何让我的 Web 服务在缺少的情况下以 XML 响应?

我已尝试将以下内容添加到 Global.asax.cs;

protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (HttpContext.Current.Request.HttpMethod == "POST" 
            && HttpContext.Current.Request.CurrentExecutionFilePath.Contains("OrderInformation"))
        {
            HttpContext.Current.Request.Headers.Add("content-type", "application/xml");
            HttpContext.Current.Request.Headers.Add("Accept", "application/xml");
        }
    }

但是在运行时会抛出异常。

TIA

马特

【问题讨论】:

  • 不添加标题,就不能直接做默认的返回类型XML吗?或者这会破坏其他客户吗?
  • 相关,但相反的问题,所以严格来说不是重复的......stackoverflow.com/questions/36492004/…(编辑:我认为这归结为您根据链接在配置中指定格式化程序的顺序? 未经测试所以可能是错误的)
  • 我不确定如何在 MVC 中执行,但您应该能够覆盖某些类并根据需要修改传入的请求标头。以下链接与 WCF 有关,但应该可以使用 MVC social.msdn.microsoft.com/Forums/vstudio/en-US/…
  • 如果“最大”公司在 2017 年不知道如何使用内容协商,您可以简单地向他们提供单独的端点。 /orders/foo.xml 之类的,然后使用 GPW 建议的解决方案

标签: c# web-services asp.net-mvc-4 asp.net-web-api


【解决方案1】:

谢谢GPW。您的链接帮助,我创建了一个 DelegatingHandler 来更正请求标头

public class MediaTypeDelegatingHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var url = request.RequestUri.ToString();

        if (url.Contains("OrderInformation"))
        {
            request.Headers.Accept.Clear();
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
        }

        return await base.SendAsync(request, cancellationToken);
    }
}

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 2015-07-04
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    相关资源
    最近更新 更多