【问题标题】:WebAPI does not return xml in IISWebAPI 在 IIS 中不返回 xml
【发布时间】:2014-07-17 08:06:58
【问题描述】:

我一直在努力解决这个问题以找到它的根源,但还没有运气。我的 WebAPI 在 IIS 中自己的应用程序池中运行,并且这些操作假定返回 XML 和 JSON,但它只返回 JSON。更奇怪的是它在其他 PC 上运行良好,所以我的猜测是我的 IIS 一定有问题,或者我缺少某种配置。如果我使用 Visual Studio Server 而不是 IIS,它工作得非常好。

API 配置:

//Added to support .net1.1 clients
config.Formatters.XmlFormatter.UseXmlSerializer = true;
config.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;
config.Formatters.Add(new FormUrlEncodedMediaTypeFormatter());

数据属性:

/// <summary>
/// Unique Transaction ID
/// </summary>
private int TransactionID;
[XmlElement(Type = typeof(int))]
public int fTransactionID
{
    get{return TransactionID;}
    set{TransactionID = value;}
}

请求标头

// Create a WebRequest to the remote site
WebRequest myWebClient = WebRequest.Create(uri);
myWebClient.ContentType = "application/xml";
myWebClient.Method = method;

编辑

API 方法

/// <summary>
/// Return Rebate Reversal Transactions
/// </summary>
/// <param name="FromDate"></param>
/// <param name="ToDate"></param>
/// <param name="PracticeID"></param>
/// <returns></returns>
[AttributeRouting.Web.Http.GET("RebateReversalTransaction/{FromDate}/{ToDate}/{PracticeID}")]
public GetRebateReversalTransactionResponse GetReversalTransaction(int FromDate, int ToDate, int PracticeID)
{
    GetRebateReversalTransactionResponse reversalResponse = new GetRebateReversalTransactionResponse();
    service = new PPNRebateSystemService();
    reversalResponse = service.GetPracticeRebateReversalTransactions(FromDate, ToDate, PracticeID);

    return reversalResponse;
}

【问题讨论】:

  • 我假设请求的ContentTypeapplication/xml?
  • 你有没有运行过 HTTP 嗅探器?
  • 我在 Chrome 上使用 Postman 来测试我的 api,即使我指定了内容类型它仍然不返回 xml
  • 您是否尝试将 WebRequest 上的“Accept:application/xml”标头设置为 API?
  • @Balachandra 是的,我有,但仍然没有运气。我认为问题在于 IIS 级别

标签: c# iis asp.net-web-api


【解决方案1】:

Global.asax.cs 中将以下代码添加到Application_Start。这将清除所有可能已注册的格式化程序,然后重新添加 XML 格式化程序。我已经对此进行了测试,即使客户端发送 JSON 接受标头 (Accept: application/json),它也会以 XML 响应。

protected void Application_Start() 
{
    ...


    GlobalConfiguration.Configuration.Formatters.Clear();
    //Force XML responses on all requests
    GlobalConfiguration.Configuration.Formatters.Add(new XmlMediaTypeFormatter());
    //Force JSON responses on all requests
    //GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

}

【讨论】:

  • 感谢它的工作,我怎样才能添加 JSON?
  • 评论一下你是如何让它工作的会更有用。我(可能还有其他人)也遇到过同样的情况 - 仍在试图弄清楚...
【解决方案2】:

您指定要接收的内容类型的方式是通过Accept 标头,而不是Content-Type 标头:

WebRequest myWebClient = WebRequest.Create(uri);
myWebClient.Headers.Add("Accept","application/xml");
myWebClient.Method = method;

Content-Type 用于指示消息正文中包含的对象类型 - 实际上,对于 GET 请求,该对象几乎总是为空的1


1您可以在GET 请求的正文中拥有某些内容,但这并不意味着对请求的处理方式有任何影响 - GET 的语义完全基于路径 - 所以我认为没有人想出实际用途。

【讨论】:

  • 我尝试过使用 Accept,但结果仍然是 JSON 而不是 XML。我在 chrome 上使用 Postman 来测试我的 api
【解决方案3】:

尝试删除 json 格式化程序。这只会给你 xml 结果。并像这样在 IIS 中进行测试。使用这个:

 config.Formatters.Remove(config.Formatters.JsonFormatter);

如果没问题,则表示您的问题出在格式化程序上。

或者您可以在 web api 方法中的请求中提供自定义标头。

Request.Content.Headers.Add("Content-Type", "application/xml");

不要忘记删除myWebclient.ContentType="application/xml";,因为我们已经在web api方法中为请求定义了一个内容头。

【讨论】:

  • 你能用你想在 xml 中呈现的 web api 方法编辑这个问题吗?
  • 请参阅编辑问题
  • 还是不行。我的 IIS 一定有问题。我能想到的就这些了。
猜你喜欢
  • 2012-07-24
  • 1970-01-01
  • 2014-09-06
  • 2023-04-03
  • 2013-12-17
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多