0

我有带有自定义绑定作为端点的 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();

我正在获取 WSDL 文件的 HTML 内容,而不是 Get 方法返回的字符串。我不知道我是否以正确的方式做这件事?

我将不胜感激在这方面的帮助。

4

1 回答 1

1

( [WebGet]and [WebInvoke]) 属性仅适用于使用webMessageEncoding绑定元素的端点;使用manualAddressing属性设置为的 HTTP 传输true,以及<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();
}

网络配置

 <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 回答