1

約 100 の関数を持つ WCF SOAP サービスがあります。それらの一部を REST エンドポイントに公開したいだけです。1つの契約だけでこれを行うことはできませんか?

次のような残りの動作と残りのエンドポイントを追加しました。

<behaviors>
      <endpointBehaviors>
        <behavior name="RestBehavior">
          <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>


<endpoint address="json" binding="webHttpBinding" behaviorConfiguration ="RestBehavior" contract="Test.IService" />
<endpoint address="" binding="customBinding" bindingConfiguration="BufferedHttpBinaryBusiness"
          bindingName="BufferedHttpBinaryBusiness" contract="Test.IService" />

WebGetそして、残りのエンドポイントで公開したい関数に属性を追加しました:

<WebGet(BodyStyle:=WebMessageBodyStyle.Wrapped, RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Json, UriTemplate:="/IsRegistered?Id={Id}")>
    <ServiceModel.OperationContract()>
    Function IsRegistered(ByVal Id As String) As Boolean

しかし、REST として公開したくない他の関数もあります。

<ServiceModel.OperationContract()> 
Function GetName(ByVal x As Long, ByVal y As String) As String
<ServiceModel.OperationContract()> 
Function GetId(ByVal name As String) As String

私が得たエラーは次のとおりです。

System.InvalidOperationException: Operation 'GetName' of contract 'IService' specifies multiple request body parameters to be serialized without any wrapper elements. At most one body parameter can be serialized without wrapper elements. Either remove the extra body parameters or set the BodyStyle property on the WebGetAttribute/WebInvokeAttribute to Wrapped.
   at System.ServiceModel.Description.WebHttpBehavior.TryGetNonMessageParameterType(MessageDescription message, OperationDescription declaringOperation, Boolean isRequest, Type& type)
   at System.ServiceModel.Description.WebHttpBehavior.ValidateBodyStyle(OperationDescription operation, Boolean request)
   at System.ServiceModel.Description.WebHttpBehavior.<>c__DisplayClass10.<>c__DisplayClass13.<GetRequestDispatchFormatter>b__d()
   at System.ServiceModel.Description.WebHttpBehavior.<>c__DisplayClass10.<GetRequestDispatchFormatter>b__c()
   at System.ServiceModel.Description.WebHttpBehavior.HideReplyMessage(OperationDescription operationDescription, Effect effect)
   at System.ServiceModel.Description.WebHttpBehavior.GetRequestDispatchFormatter(OperationDescription operationDescription, ServiceEndpoint endpoint)
   at System.ServiceModel.Description.WebHttpBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
   at System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost)
   at System.ServiceModel.ServiceHostBase.InitializeRuntime()
   at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)

この関数に WebGet 属性を追加すると、別の SOAP 関数でも同じエラーが発生します。すべての関数に WebGet 属性を適用する必要があるようです。つまり、REST エンドポイントに公開するには、すべての関数をコントラクトで公開する必要があります。しかし、そのうちの一部だけを REST として公開したいと考えています。それは可能ですか?

4

1 に答える 1

4

要するに、いいえ。SOAP と REST の両方を連携させるには、2 つの異なるコントラクトが必要です。ただし、両方のエンドポイントを同じ構成に追加できます。良い点は、別のインターフェイス/コントラクトで REST 操作を定義し、そのインターフェイスからサービスを継承させるだけでよく、コードを変更する必要がないことです。

以下の記事は優れた説明であり、サービスに両方を実装する方法です。これは、私が作成した 2 つの独自のサービスの例として使用しました。

同じ WCF サービスで REST と SOAP の両方を有効にする方法

于 2012-11-06T21:51:57.670 に答える