使WCF Web服务与GET请求一起工作

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

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

现在的情况
我能够使用VS2008附带的WcfTestClient使用服务。 我也可以通过在另一个项目中添加服务引用或使用svcutil.exe命令行来生成代理和configuration文件来创build自己的WCF客户端。

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

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

我已经在这个其他堆栈溢出问题的信息:
用于WCF服务的REST / SOAP EndPoints

不过,在执行这些步骤后,我得到一个空白页面或一个HTTP 404错误。 代码没有什么特别之处。 我只是把一个string作为参数,并返回“你好xxx”。 这是一个基本的“你好WCF世界”概念certificatetypes的东西。


更新 – 这是相关的代码

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

Web.Config – system.serviceModel部分

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

看看你的web.config serviceModel部分,我可以看到你需要添加一个webHttpBinding并关联一个包含webHttpGet的endPointBehavior 。

您的运营合同是正确的。 以下是您的system.serviceModelconfiguration部分的外观,以便您能够使用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> 

一定要为你的wsHttpBinding端点分配一个不同的地址,否则你会得到一个错误,说你有两个端点在同一个URI上监听。

另一种select是将地址留在wsHttpBinding中,但为webHttpBinding服务分配一个不同的地址。 但是,这也会改变你的GET地址。

例如,如果将地址分配为“asmx”,则可以使用地址“ MyService.svc/asmx/MyMethod?MyParam=xxxx ”调用服务。

正常的WCF请求总是SOAP请求 – 你不能只用浏览器就能得到这个,你需要WCF Testclient。

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

渣子

正如marc_s所说 ,REST入门工具包可以提供帮助,但是您也应该知道,.NET 3.5直接支持REST服务。 这不像完成入门套件那样完整,但是非常有用。

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

 [WebGet(UriTemplate = "helloworld/{name}")] string Helloworld(string name); 

看到这个门户吨的信息。

请注意,如果您在configuration中指定了多个端点/绑定,则可以将同一服务公开为SOAP和REST。