3

最近、WCF SOAP サービスを REST/JSON サービスに変換しました。こちらの回答で詳しく説明されているように、Visual Studio のサービス参照の追加機能では、JSON サービスのコードを生成できません。その質問の回答のリンクされた記事は、問題を解決するために WCF を REST と SOAP の両方として公開する可能性をほのめかしていますが、その方法については詳しく説明していません。

これが可能かどうか、また可能であれば設定方法を知っている人はいますか?

WCF REST サービスの WSDL を読み取り、C# クラスを生成するコード ジェネレーターを自分で作成するという選択肢は常にありますが、これよりも簡単な解決策があるはずです。

参考までに、私のweb.config:

<system.serviceModel>
<behaviors>
  <endpointBehaviors>
    <behavior name="RestBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="GetBehavior" >
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug
         httpHelpPageEnabled="true"
         includeExceptionDetailInFaults="true"
      />
    </behavior>
  </serviceBehaviors>
</behaviors>
<bindings>
  <webHttpBinding>
    <binding name="WebHttpBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="None" />
      </security>
    </binding>
  </webHttpBinding>
</bindings>
<services>
  <service name="Service" behaviorConfiguration="GetBehavior">
    <endpoint address=""
      binding="webHttpBinding"
      behaviorConfiguration="RestBehavior"
      contract="IService"
      bindingConfiguration="WebHttpBinding">
    </endpoint>
  </service>
</services>
</system.serviceModel>

私のサービスメソッドはすべて次の属性を持っています:

[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
4

2 に答える 2

2

2 つのエンドポイントを作成する必要がある可能性があります。1 つは SOAP 用、もう 1 つは json 用です。私は自分のプロジェクトでそれを行っており、SoapUI または Fiddler (json) を介して同時にサービスにアクセスできます。設定例は次のとおりです。

<system.serviceModel>
 <behaviors>
  <serviceBehaviors>
   <behavior name="BehaviourService">
    <serviceMetadata httpGetEnabled="true" />
     <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
      <behavior name="BehaviourWebHttp">
        <webHttp  defaultBodyStyle="Wrapped" automaticFormatSelectionEnabled="True" faultExceptionEnabled="True" />
      </behavior>
  </endpointBehaviors>
</behaviors>

<services>
  <service name="NameSpace.MyService" behaviorConfiguration="BehaviourService" >
    <endpoint address ="soap" binding="basicHttpBinding" contract="NameSpace.IMyService"></endpoint>
    <endpoint binding="webHttpBinding" behaviorConfiguration="BehaviourWebHttp" contract="NameSpace.IMyService" ></endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7689/MyService.svc"/>
      </baseAddresses>
    </host>
  </service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

また、コントラクトを次のようにします。

[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "MyMethod", Method = "POST")]
bool MyMethod();

次に、"localhost:7689/MyService.svc?wsdl" 経由で SOAP にアクセスし、"localhost:7689/MyService.svc/MyMethod" 経由で JSON にアクセスできます。

于 2014-05-28T11:53:36.717 に答える
0

私の知る限り、WCF からの json 応答と xml 応答を組み合わせるには 3 つのオプションがあり、どちらも望ましくありません。

  1. XML と JSON の特定のメソッド (およびエンドポイント) を記述し、それに応じて装飾する
  2. シリアル化エンジンにフックし、これをaccepthttp 要求からのヘッダーの検査と組み合わせます。
  3. メソッドが を受け入れて返すようStream にします。慣例により、リクエスト ストリームとレスポンス ストリームに直接アクセスできるように WCF に指示します

各メソッドには独自の欠点があります: 1. シリアル化は URL (リソースを識別する必要がある) ではなく、http ヘッダーを使用して決定する必要があるため、これは見苦しく、Rest の考え方に反します。2. シリアライゼーション エンジンへのアタッチは複雑であり、シリアライゼーションを判断するためにヘッダーを調べる必要があります。3. リクエスト パラメータのマッピングに何の助けも得られず、シリアライゼーションによってメソッド本体が乱雑になります。

方法3は簡単で始めやすいのでよく使っていますが、方法2の方が正しいようです。

于 2013-07-21T21:45:56.937 に答える