0

エンドポイントとして custombinding を使用する WCF Web サービスがあります。この Web サービス (IIS でホストされている) をクライアント アプリケーションから呼び出したいと考えています。

サービス契約は次のようになります。

 [ServiceContract(Namespace = "http://schemas.microsoft.com/windows/management/2012/01/enrollment")]
    [XmlSerializerFormat]
    public interface IDiscoveryService
    {    
        [OperationContract(Name = "Get")]
        [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat=WebMessageFormat.Xml, ResponseFormat=WebMessageFormat.Xml)]
        string DiscoveryGet();
    }

Web.CONfig ファイルの内容は次のようになります。

 <system.serviceModel>
    <bindings>
      <customBinding>
        <binding name="NewBinding0">
          <textMessageEncoding />
          <httpTransport />
        </binding>
      </customBinding>
    </bindings>
    <services>
      <service name="DiscoveryWebService.DiscoveryService">
        <endpoint address="" binding="customBinding" bindingConfiguration="NewBinding0"
          contract="DiscoveryWebService.IDiscoveryService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

クライアント アプリケーション コードは次のようになります。

 string uri = " http://localhost/EnrollmentServer/Discovery.svc";

 HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
 req.ContentType = "unknown";
 req.Method = "GET";
 WebResponse response = req.GetResponse();

 StreamReader loResponseStream = new StreamReader(response.GetResponseStream(), false);

 string responseString = loResponseStream.ReadToEnd();

Get メソッドによって返される文字列ではなく、WSDL ファイルの HTML コンテンツを取得しています。正しい方法で行っているかどうかわかりませんか?

この点で助けていただければ幸いです。

4

1 に答える 1

1

( [WebGet]and ) 属性は、バインディング要素[WebInvoke]を使用するエンドポイントに対してのみ受け入れられます。プロパティが に設定されwebMessageEncodingた HTTP トランスポートと、サービスにはないエンドポイントの動作を使用します。以下にリストされている変更を行うと、動作するはずです。manualAddressingtrue<webHttp/>

サービス契約:

[ServiceContract(Namespace = "http://schemas.microsoft.com/windows/management/2012/01/enrollment")]
[XmlSerializerFormat]
public interface IDiscoveryService
{    
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
    string DiscoveryGet();
}

Web.config :

 <system.serviceModel>
    <bindings>
      <customBinding>
        <binding name="NewBinding0">
          <webMessageEncoding />
          <httpTransport manualAddressing="true" />
        </binding>
      </customBinding>
    </bindings>
    <services>
      <service name="DiscoveryWebService.DiscoveryService">
        <endpoint address="" binding="customBinding" bindingConfiguration="NewBinding0"
          contract="DiscoveryWebService.IDiscoveryService" behaviorConfiguration="Web" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="Web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

クライアントコード:

 string uri = "http://localhost/EnrollmentServer/Discovery.svc/DiscoveryGet";

 HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
 req.Method = "GET";
 WebResponse response = req.GetResponse();

 StreamReader loResponseStream = new StreamReader(response.GetResponseStream(), false);

 string responseString = loResponseStream.ReadToEnd();
于 2013-06-24T00:36:34.093 に答える