2

最新のNugetパッケージ(3.8.3だと思いますか?)を使用して構成された非常にシンプルなServiceStack Webサービスがあります。私が行った主な変更は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)行が単なる ではなくサービスに含まれている場合、Soap クライアントは例外をスローします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>

ここで私が間違っているかもしれないことについての洞察はありますか? 前もって感謝します。

4

2 に答える 2

1

SOAP の圧縮は現在サポートされていません。

この機能をリクエストして追跡するには、 https://github.com/ServiceStack/ServiceStack/issuesで問題を提出できます。

于 2012-07-05T04:31:48.823 に答える
0

ServiceStackのJSONシリアライザーを除いて、これまでにこれに遭遇しました...戻り値のタイプを明示的に指定する必要があります。

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

object(たとえば、リターンタイプとして使用することはできません。)

私たちはさまざまな方法(dyanmicジェネリックなど)を何度も試しましたが、SerivceStackはデータ契約の性質上、これらをグローバルにサポートしていません。

RunPingResponse()最終的にやらなければならなかったのは、ジェネリック/単純なオブジェクト(たとえば、RunOtherResponse()など)を使用する予定だったタイプごとにAPIメソッドを作成することです。:(

于 2012-07-04T03:17:09.797 に答える