背景
我以前创建了ASMX Web服务,并且能够使用地址约定从Web浏览器和Ajax GET请求访问该服务:
MyService.asmx/MyMethod?Param=xxx
我刚开始使用WCF并在我的ASP.NET项目中创建了一个新的Web服务。它创建一个扩展名为.svc的文件,例如MyService.svc。
现状
我可以使用VS2008附带的WcfTestClient
来使用该服务。我也可以通过在另一个项目中添加服务引用或使用svcutil.exe
命令行来生成代理和配置文件来创建自己的WCF客户端。
问题
当我尝试使用MyService.svc/MyMethod?MyParam=xxx
从浏览器使用该服务时,我得到一个没有任何错误的空白页。
我尝试了什么
我已经在web.config中添加了basicHttpBinding并在行为配置中将其设为HttpGetEnabled。我还将[WebGet(UriTemplate = "MyMethod?MyParam={MyParam}")]
属性添加到我的操作合同中。
我已经关注了其他堆栈溢出问题中的信息:
的 REST / SOAP EndPoints for a WCF Service
但是,在执行这些步骤后,我得到一个空白页面或HTTP 404错误。代码没有什么特别之处。我只是接受一个字符串作为参数并返回“Hello xxx”。这是一个基本的“Hello WCF World”概念验证类型的东西。
<小时/> 更新 - 这是相关代码
[ServiceContract]
public interface IMyService
{
[WebGet(UriTemplate = "MyMethod/MyParam={MyParam}")]
[OperationContract]
string MyMethod(string MyParam);
}
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>
答案 0 :(得分:45)
查看您的web.config
serviceModel部分,我可以看到您需要添加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>
请务必为wsHttpBinding端点分配不同的地址,否则您将收到一条错误消息,指出您有两个端点侦听同一URI。
另一种选择是将地址留空在wsHttpBinding中,但为webHttpBinding服务分配不同的地址。但是,这也将改变您的GET地址。
例如,如果您将地址指定为“asmx”,则可以使用地址“MyService.svc/asmx/MyMethod?MyParam=xxxx
”来呼叫您的服务。
答案 1 :(得分:5)
正常的WCF请求总是SOAP请求 - 您将无法通过浏览器实现这一点,您需要WCF Testclient。
WCF有一个名为WCF REST Starter Kit的附加组件(它也将包含在带有.NET 4.0的WCF 4.0中),它允许您使用GET / POST / PUT / DELETE HTTP命令来查询WCF服务等。但是,您需要专门为REST编写服务 - 您不能在同一服务调用上使用SOAP和REST。
马克
答案 2 :(得分:4)
作为marc_s says,REST入门套件可以提供帮助,但您也应该知道.NET 3.5直接支持REST服务。它不像使用入门套件那样完整,但它很有用。
它的工作方式是在操作上加上[WebGet]
属性,以指示URL中各种参数的来源:
[WebGet(UriTemplate = "helloworld/{name}")]
string Helloworld(string name);
请参阅this portal了解大量信息。
注意,如果在配置中指定了多个端点/绑定,则可以使用SOAP和REST公开相同的服务。