WebAPI不会在IIS中返回xml

时间:2014-07-17 08:06:58

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

我一直在努力解决这个问题,但却没有运气。我的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;
}

3 个答案:

答案 0 :(得分:2)

Global.asax.cs中,将以下代码添加到Application_Start。这将清除可能已注册的任何Formatters,然后添加回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());

}

答案 1 :(得分:1)

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

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

Content-Type用于指示消息正文中包含的对象类型 - 对于GET请求 1 ,该消息几乎总是为空。< / p>


1 您被允许在GET请求的正文中拥有,但这并不意味着对请求的方式有任何影响已处理 - GET的语义完全基于路径 - 因此我认为没有人会为此提出实际用途。

答案 2 :(得分:0)

尝试删除json格式化程序。这将为您提供xml结果。并在IIS中进行测试。使用此:

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

如果可以,那就意味着您的问题出在格式化程序中。

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

  

Request.Content.Headers.Add(&#34; Content-Type&#34;,&#34; application / xml&#34;);

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