使WCF Web服务与GET请求一起使用

ich*_*ban 41 asp.net rest wcf web-services

背景
我以前创建了ASMX Web服务,并且能够使用地址约定从Web浏览器和Ajax GET请求访问该服务:
MyService.asmx/MyMethod?Param=xxx

我刚开始使用WCF并在我的ASP.NET项目中创建了一个新的Web服务.它创建一个扩展名为.svc的文件,例如MyService.svc.

现状
我可以使用WcfTestClientVS2008附带的服务来使用该服务.我还可以通过在另一个项目中添加服务引用或使用svcutil.exe命令行生成代理和配置文件来创建自己的WCF客户端.

问题
当我尝试使用浏览器中的服务时MyService.svc/MyMethod?MyParam=xxx,我得到一个没有任何错误的空白页面.

我尝试过
我已经在web.config中添加了一个basicHttpBinding,并在行为配置中使其成为HttpGetEnabled.我还将[WebGet(UriTemplate = "MyMethod?MyParam={MyParam}")]属性添加到我的操作合同中.

我已经遵循了其他堆栈溢出问题中的信息:
WCF服务的REST/SOAP EndPoints

但是,在执行这些步骤后,我得到一个空白页面或HTTP 404错误.代码没有什么特别之处.我只是接受一个字符串作为参数并返回"Hello xxx".这是一个基本的"Hello WCF World"概念验证类型的东西.


更新 - 这是相关的代码

[ServiceContract]
public interface IMyService
{
    [WebGet(UriTemplate = "MyMethod/MyParam={MyParam}")]
    [OperationContract]
    string MyMethod(string MyParam);
}
Run Code Online (Sandbox Code Playgroud)

Web.Config - system.serviceModel Section

<system.serviceModel>     
    <behaviors>
        <serviceBehaviors>          
            <behavior name="MyServiceBehavior">
              <serviceMetadata httpGetEnabled="true"  />
              <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="MyServiceBehavior" name="MyService">
        <endpoint address="" 
                       binding="wsHttpBinding" contract="IMyService" />
        <endpoint address="MyService.svc" 
                       binding="basicHttpBinding"  contract="IMyService" />
        <endpoint address="mex" 
                       binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>    
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

Jos*_*lio 46

查看web.configserviceModel部分,我可以看到您需要添加webHttpBinding并关联包含webHttpGet的endPointBehavior.

您的运营合同是正确的.以下是system.serviceModel配置部分的外观,以便您能够从GET HTTP请求中使用该服务.

<system.serviceModel>     
    <behaviors>
        <serviceBehaviors>
            <behavior name="MyServiceBehavior">
                <serviceMetadata httpGetEnabled="true"    />
                <serviceDebug includeExceptionDetailInFaults="true"/>          
            </behavior>
        </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="WebBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>    
    <services>      
      <service behaviorConfiguration="MyServiceBehavior" name="MyService">
        <endpoint address="ws" binding="wsHttpBinding" contract="IMyService"/>
        <endpoint address="" behaviorConfiguration="WebBehavior"
                  binding="webHttpBinding"
                  contract="IMyService">
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>    
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

请务必为wsHttpBinding端点分配不同的地址,否则您将收到一条错误消息,指出您有两个端点侦听同一URI.

另一种选择是将地址留空在wsHttpBinding中,但为webHttpBinding服务分配不同的地址.但是,这也会改变您的GET地址.

例如,如果您将地址指定为"asmx",则可以使用地址" MyService.svc/asmx/MyMethod?MyParam=xxxx" 来呼叫您的服务.


mar*_*c_s 6

正常的WCF请求总是SOAP请求 - 您将无法通过浏览器实现这一点,您需要WCF Testclient.

WCF的附加组件称为WCF REST入门工具包(它也将包含在带有.NET 4.0的WCF 4.0中),它允许您使用GET/POST/PUT/DELETE HTTP命令来查询WCF服务等.但是,您需要专门为REST编写服务 - 您不能在同一服务调用上使用SOAP和REST.


Erv*_*ter 5

正如marc_s 所说,REST Starter Kit 可以提供帮助,但您还应该知道 .NET 3.5 直接支持 REST 服务。它不像使用入门工具包所能完成的那么完整,但它很有用。

它的工作方式是[WebGet]在操作上放置一个属性,以指示各种参数应来自 URL 中的哪个位置:

[WebGet(UriTemplate = "helloworld/{name}")]
string Helloworld(string name);
Run Code Online (Sandbox Code Playgroud)

请参阅此门户以获取大量信息。

请注意,如果您在配置中指定多个端点/绑定,则您可以将相同的服务作为 SOAP 和 REST 公开。