2

跟进我在这里提出的上一个问题的解决方案。看来我现在有一个问题,如果我在我的 .NET4 Web 服务中使用自定义绑定,那么当我实现 Web 服务 WebInvoke 合同的方法包含请求主体 Stream 的参数时,它们将不再被调用。

因此,这是从上面的链接中找到的运行 Web 服务的代码:

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 向 Web 服务端点合同发出 HTTP 请求,它将返回连接重置 HTTP 错误响应。如果我删除 Stream httpRequestPostBody 参数,那么它将运行该方法,但我无法访问请求正文中的原始 JSON 数据(我可以获取正文,但它是 XML 形式的)。所以我只能收集到我在自定义绑定中遗漏了一些东西,以确保可以传递请求的主体流。有人有任何线索吗?

4

1 回答 1

0

所以我能想出的唯一答案是从合同中删除流,然后使用 .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);
}

这个解决方案并不理想,因为消息正在从 RAW 转换为 JSON 到 XML 到 MyObject,此外还不允许我轻松使用更好的第 3 方 JSON 解析器并控制如何从传入数据初始化我的对象。如果有人有更好的解决方案,我会全力以赴。

于 2012-10-17T02:45:51.007 回答