C# WebAPI在IIS中不返回xml

C# WebAPI在IIS中不返回xml,c#,iis,asp.net-web-api,C#,Iis,Asp.net Web Api,我一直在努力解决这个问题,以找到它的根源,但没有运气。我的WebAPI在IIS中运行在它自己的应用程序池中,动作应该返回XML和JSON,但它只返回JSON。更奇怪的是,它可以在其他PC上正常工作,所以我猜一定是我的IIS出了问题,或者我缺少某种配置。如果我使用visualstudioserver而不是IIS,它工作得非常好 API配置: //Added to support .net1.1 clients config.Formatters.XmlFormatter.UseXmlSeriali

我一直在努力解决这个问题,以找到它的根源,但没有运气。我的WebAPI在IIS中运行在它自己的应用程序池中,动作应该返回XML和JSON,但它只返回JSON。更奇怪的是,它可以在其他PC上正常工作,所以我猜一定是我的IIS出了问题,或者我缺少某种配置。如果我使用visualstudioserver而不是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;}
}
数据属性:

//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;}
}
编辑

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;
}
//
///退货回扣冲销交易记录
/// 
/// 
/// 
/// 
/// 
[AttributeRouting.Web.Http.GET(“RebatereVersaltTransaction/{FromDate}/{ToDate}/{PracticeID}”)]
公共GetRebaterVersaltTransaction响应GetReversalTransaction(int FromDate、int ToDate、int PracticeID)
{
GetReBatereVersaltTransactionResponse reversalResponse=新建GetReBatereVersaltTransactionResponse();
服务=新的PPNRebateSystemService();
reversalResponse=service.getPracticeBateReversalTransactions(FromDate,ToDate,PracticeID);
返回反向响应;
}

尝试删除json格式化程序。这将只提供xml结果。然后像这样在IIS中进行测试。使用以下命令:

 config.Formatters.Remove(config.Formatters.JsonFormatter);
如果没有问题,这意味着您的问题在格式化程序中

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

添加(“内容类型”、“应用程序/xml”)


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

指定要接收的内容类型的方式是通过
接受
头,而不是
内容类型
头:

WebRequest myWebClient = WebRequest.Create(uri);
myWebClient.Headers.Add("Accept","application/xml");
myWebClient.Method = method;
内容类型
用于指示消息正文中包含的对象类型-对于
GET
request1,实际上几乎总是空的



1您可以在
GET
请求的正文中包含某些内容,但是它并不意味着对请求的处理方式有任何影响,
GET
的语义纯粹是基于路径的,所以我认为没有人想到过它的实际用途。

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


我假设请求的
ContentType
application/xml
?你运行HTTP嗅探器了吗?我使用Chrome上的Postman来测试我的api,即使我指定了内容类型,它仍然不会返回xml。你有没有尝试将WebRequest上的“Accept:application/xml”头设置为api?@Balachandra是的,我有,但仍然没有运气。我认为问题存在于IIS级别。您是否可以使用希望以xml呈现的web api方法编辑此问题?请参阅“编辑问题”仍然不起作用。我的IIS一定有问题。这就是我所能想到的。我尝试过使用Accept,但结果仍然是JSON而不是XML。我正在用chrome上的Postman来测试我的APIs。谢谢你这么做,我怎样才能添加JSON呢?如果你能评论一下你是如何让它工作的,那就更有用了。我(可能还有其他人)也遇到了同样的情况——仍在试图弄明白。。。