【问题标题】:Servicestack SOAP & ToOptimizedResult Client Parse ErrorServicestack SOAP & ToOptimizedResult 客户端解析错误
【发布时间】:2012-07-04 03:10:30
【问题描述】:

我使用最新的 Nuget 包(我相信是 3.8.3?)配置了一个超级简单的 ServiceStack 网络服务。我所做的主要更改是调用ResultContext.ToOptimizedResult(object) 以在调用客户端支持的情况下压缩响应消息。服务定义如下:

public class PingService : BaseService<Ping>
    {
        protected override string OperationName { get { return "Ping"; } }

        protected override object Run(Ping request)
        {
            // Implementation removed for brevity
            return new PingResponse();
        }

        protected override object OnAfterExecute(object response)
        {
            //return response;
            return RequestContext.ToOptimizedResult(response);
        }
    }

客户端代码如下:

var jsonClient = new JsonServiceClient("http://localhost/WebAppServiceV3/api");
var response = jsonClient.Send<PingResponse>(new Ping { LoginInfo = new ClientLoginInfo { UserName = "guest", Password = "guest", ClientPlatform = "TEST", ClientVersion = "1.3", InstanceUID = Guid.NewGuid().ToString() } });
Console.WriteLine(response.ToJson() + "\n");

var jsvClient = new JsvServiceClient("http://localhost/WebAppServiceV3/api");
response = jsvClient.Send<PingResponse>(new Ping { LoginInfo = new ClientLoginInfo { UserName = "guest", Password = "guest", ClientPlatform = "TEST", ClientVersion = "1.3", InstanceUID = Guid.NewGuid().ToString() } });
Console.WriteLine(response.ToJsv() + "\n");

var xmlClient = new XmlServiceClient("http://localhost/WebAppServiceV3/api");
response = xmlClient.Send<PingResponse>(new Ping { LoginInfo = new ClientLoginInfo { UserName = "guest", Password = "guest", ClientPlatform = "TEST", ClientVersion = "1.3", InstanceUID = Guid.NewGuid().ToString() } });
Console.WriteLine(response.ToXml() + "\n");

var soap11 = new Soap11ServiceClient("http://localhost/WebAppServiceV3/api");
response = soap11.Send<PingResponse>(new Ping { LoginInfo = new ClientLoginInfo { UserName = "guest", Password = "guest", ClientPlatform = "TEST", ClientVersion = "1.3", InstanceUID = Guid.NewGuid().ToString() } });
Console.WriteLine(response.ToXml() + "\n");

var soap12 = new Soap12ServiceClient("http://localhost/WebAppServiceV3/api");
response = soap12.Send<PingResponse>(new Ping { LoginInfo = new ClientLoginInfo { UserName = "guest", Password = "guest", ClientPlatform = "TEST", ClientVersion = "1.3", InstanceUID = Guid.NewGuid().ToString() } });
Console.WriteLine(response.ToXml() + "\n");

Json、Jsv 和 Xml 客户端都在此处接收压缩响应并正常工作。当服务中包含return ResultContext.ToOptimizedResult(result) 而不仅仅是return result 时,Soap 客户端会抛出异常。

客户端似乎期待&lt;PingResponse/&gt; 元素,但在返回压缩结果时却收到&lt;Base64Binary/&gt; 元素:

Error in line 1 position 185. Expecting element 'PingResponse' from namespace 'http://schemas.datacontract.org/2004/07/IMDSSWebService_SS.ServiceModel'.. Encountered 'Element'  with name 'base64Binary', namespace 'http://schemas.microsoft.com/2003/10/Serialization/'.

压缩打开(失败)

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body>
    <base64Binary xmlns="http://schemas.microsoft.com/2003/10/Serialization/">...</base64Binary>
  </s:Body>
</s:Envelope>

压缩关闭(成功)

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body>
    <PingResponse>...<PingResponse>
  </s:Body>
</s:Envelope>

任何关于我在这里可能做错了什么的见解?提前致谢。

【问题讨论】:

    标签: web-services soap servicestack


    【解决方案1】:

    目前不支持 SOAP 压缩。

    您可以在https://github.com/ServiceStack/ServiceStack/issues 提出问题以请求和跟踪此功能。

    【讨论】:

    【解决方案2】:

    我们之前遇到过这种情况,除了 ServiceStack 中的 JSON 序列化器...您必须明确指定返回类型:

    protected PingResponse Run(Ping request)
    {
        // Implementation removed for brevity
        return new PingResponse();
    }
    

    (例如,您不能使用object 作为返回类型。)

    我们来回尝试所有不同的方法(dyanmic、泛型等),但由于其数据合同性质,SerivceStack 并未在全球范围内支持这些方法。

    我们最终要做的是为每种将使用泛型/简单对象的类型(例如RunPingResponse()RunOtherResponse() 等)创建 API 方法。 :(

    【讨论】:

    • 这看起来与他的问题无关。将 PingResponse DTO 返回为 object 有效。您不能像代码示例中那样更改方法签名 - ServiceBase.Run 返回一个对象。 ServiceStack 支持 .NET 3.5,这就是为什么 dynamic 不起作用,而 generic 起作用 - 但它的使用可能很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    相关资源
    最近更新 更多