2012-07-04 95 views
2

我有一个使用最新的Nuget包配置的超级简单的ServiceStack webservice(3.8.3我相信?)。我做的主要改变是呼叫ResultContext.ToOptimizedResult(object)压缩响应消息,如果调用客户端支持它。该服务的定义如下:Servicestack SOAP&ToOptimizedResult客户端解析错误

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时,肥皂客户端会抛出异常。

看来,客户端需要一个<PingResponse/>元素,但在部分<Base64Binary/>元素,而不是当返回压缩结果:

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> 

任何insig我在这里可能做错了什么?提前致谢。

回答

0

我们以前碰到这个,除非在ServiceStack的JSON序列......你必须明确地指定返回类型:

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

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

我们来回尝试所有不同的方法(dyanmic,泛型等),而SerivceStack由于其数据契约性质而不能全局支持这些方法。

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

+1

这看起来并不涉及他的问题。返回的PingResponse作为DTO 'object' works。你不能像你的代码示例中那样改变方法签名 - ServiceBase.Run返回一个对象。ServiceStack支持.NET 3.5,这就是为什么动态不起作用,通用做 - 但它可能是使用奇怪。 – mythz