C# WCF REST服务在使用自定义绑定时未传递POST请求正文流
从我问的前一个问题的解决方案开始跟进。现在我似乎遇到了一个问题,如果我在.NET4 web服务中使用自定义绑定,那么当实现web服务WebInvoke契约的方法包含请求主体流的参数时,它们就不再被调用 下面是从上面的链接中找到的运行Web服务的代码:C# WCF REST服务在使用自定义绑定时未传递POST请求正文流,c#,.net,wcf,web-services,C#,.net,Wcf,Web Services,从我问的前一个问题的解决方案开始跟进。现在我似乎遇到了一个问题,如果我在.NET4 web服务中使用自定义绑定,那么当实现web服务WebInvoke契约的方法包含请求主体流的参数时,它们就不再被调用 下面是从上面的链接中找到的运行Web服务的代码: webserviceHost = new WebServiceHost(typeof(Service1), new Uri("http://localhost:8080)); webserviceHost.AddServiceEndpoint(ty
webserviceHost = new WebServiceHost(typeof(Service1), new Uri("http://localhost:8080));
webserviceHost.AddServiceEndpoint(typeof(IService), getBinding(), "webservice").Behaviors.Add(new WebHttpBehavior());
webserviceHost.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
webserviceHost.Open();
以下是定义的WebInvoke服务契约:
[WebInvoke(UriTemplate = "import_data?param={value}", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
WebResult importOrder(string value, Stream httpRequestPostBody);
以下是执行上述合同的方法:
public WebResult importOrder(String value, Stream httpRequestPostBody)
{
doSomething(value, httpRequestPostBody);
}
因此,如果我尝试通过Fiddler向webservice端点契约发出HTTP请求,它将返回连接重置HTTP错误响应。如果我删除Stream-httpRequestPostBody参数,那么它将运行该方法,但我无法访问请求体中的原始JSON数据(我可以获取体,但它是XML格式的)。因此,我只能收集我的自定义绑定中缺少的东西,以确保请求的主体流可以被传递。有人找到线索了吗?所以我能想到的唯一答案是从契约中删除流,然后使用.NET的DataContractJsonSerializer将HTTP请求正文消息从XML转换回JSON。如下图所示 合同:
[WebInvoke(UriTemplate = "import_data?param={value}", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
WebResult importOrder(string value);
实施:
public WebResult importOrder(String value){
MyObject myObject = (MyObject)new DataContractJsonSerializer(typeof(MyObject)).ReadObject(OperationContext.Current.RequestContext.RequestMessage.GetReaderAtBodyContents());
doSomething(value, myObject);
}
此解决方案并不理想,因为消息正在从原始数据转换为JSON,从XML转换为MyObject,而且还不允许我轻松使用更好的第三方JSON解析器并控制如何从传入数据初始化对象。
如果有人有更好的解决办法,我洗耳恭听