我一直在努力解决这个问题,但却没有运气。我的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;
}
答案 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方法中为请求定义了内容标题。