約 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 として公開したいと考えています。それは可能ですか?