[英]WCF odd behavior: application/xml but JSON body in request
我定义了一个端点:
[ServiceContract]
interface IRequestStuff
{
[OperationContract]
[WebInvoke(UriTemplate = "token", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
ResponseData RequestStuff(RequestData request);
}
我这样称呼它:
using (var f = new WebChannelFactory<IRequestStuff>(new Uri("http://myhost/TestService/RequestStuff.svc")))
{
var request = new RequestData()
{
Member1 = "Member 1",
Member2 = "Member 2"
};
var response = f.CreateChannel().RequestStuff(request);
}
我还在指定位置有一个侦听Web服务终结点。 当我尝试从测试应用程序拨打电话时,一切正常。 但是,当我从另一个Web服务内部调用RequestStuff时,该请求具有最奇怪的东西-它具有“ Content-Type:application / xml”,但是主体为JSON {“ Member1”:“ Member 1”,“ Member2” :“成员2”}。
端点自然会返回Bad Request,因为该请求的格式不正确。
这里发生了什么?
如果使用的是WCF 4.0,则可以启用WebHttpBehavior
automaticFormatSelectionEnabled
属性。 请查看此以获取更多详细信息。
事实证明,在这种特殊情况下,我必须创建一个新的OperationContextScope来放置出站请求。 可能是因为调用方和被调用的服务位于同一主机上。
using (var f = new WebChannelFactory<IRequestStuff>(new Uri("http://myhost/TestService/RequestStuff.svc")))
{
var request = new RequestData()
{
Member1 = "Member 1",
Member2 = "Member 2"
};
var intf = f.CreateChannel();
using (new OperationContextScope((IContextChannel)intf))
{
var response = intf.RequestStuff(request);
}
}
只需从WebInvoke
属性中删除RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json
。 如上所述,还启用自动格式选择可能会很有用:
f.Endpoint.Behaviors.Add(new WebHttpBehavior
{
AutomaticFormatSelectionEnabled = true
});
var intf = f.CreateChannel();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.