servicestack,Web Services,Soap,servicestack" /> servicestack,Web Services,Soap,servicestack" />

Web services servicestacksoap&;ToOptimizedResult客户端分析错误

Web services servicestacksoap&;ToOptimizedResult客户端分析错误,web-services,soap,servicestack,Web Services,Soap,servicestack,我有一个超级简单的ServiceStack webservice,它是使用最新的Nuget包(我相信是3.8.3?)配置的。我所做的主要更改是调用ResultContext.ToOptimizedResult(object)来压缩响应消息(如果调用客户端支持)。该服务的定义如下: public class PingService : BaseService<Ping> { protected override string OperationName { ge

我有一个超级简单的ServiceStack webservice,它是使用最新的Nuget包(我相信是3.8.3?)配置的。我所做的主要更改是调用
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");
压缩打开(失败)


...
压缩关闭(成功)


...

有没有关于我在这里做错了什么的见解?提前感谢。

我们以前遇到过这个问题,除了ServiceStack中的JSON序列化程序。。。必须显式指定返回类型:

protected PingResponse Run(Ping request)
{
    // Implementation removed for brevity
    return new PingResponse();
}
(例如,您不能使用
对象
作为返回类型。)

我们反复尝试了所有不同的方法(
dyanmic
、泛型等),而SerivTestack由于其数据契约性质,无法在全球范围内支持这些方法


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

当前不支持SOAP压缩


您可以在提交问题以请求并跟踪此功能。

这看起来与他的问题无关。将PingResponse DTO作为
对象返回有效。您不能像在代码示例中那样更改方法签名-
ServiceBase.Run
返回一个对象。ServiceStack支持.NET 3.5,这就是为什么dynamic不支持.NET 3.5ork,generic有-但它可能被使用得很奇怪。问题创建于。谢谢mythz
<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>
protected PingResponse Run(Ping request)
{
    // Implementation removed for brevity
    return new PingResponse();
}