我有一个WCF REST服务,很简单,就像这样:
[ServiceContract]
public interface ITestService
{
[OperationContract]
[WebInvoke(
Method = "GET",
UriTemplate = "getNumber")]
int GetSomeNumber();
}
public class TestService : TestServiceApp.ITestService
{
public int GetSomeNumber()
{
return 5;
}
}
配置如下:
<services>
<service name="TestServiceApp.TestService">
<endpoint address="" binding="webHttpBinding" behaviorConfiguration="restBehaviour" contract="TestServiceApp.ITestService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="restBehaviour">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
使用指定的Uri模板从浏览器调用它可以正常工作:
http://localhost:52602/TestService.svc/getnumber.
我像这样配置了我的客户端:
<client>
<endpoint name="TstSvc" address="http://localhost:52602/TestService.svc" binding="webHttpBinding" contract="TstSvc.ITestService" behaviorConfiguration="restBehaviour"/>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="restBehaviour">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
当我使用以下代码调用服务时:
using (WebChannelFactory<ITestService> factory = new WebChannelFactory<ITestService>("TstSvc"))
{
var svc = factory.CreateChannel();
svc.GetSomeNumber();
}
我收到错误:
“没有端点在听 可以接受的
http://localhost:52602/TestService.svc/GetSomeNumber
消息。“
我怀疑由于某种原因,使用GetSomeNumber方法的调用未正确映射到uri / getnumber。为什么?我怎么能解决这个问题,我错过了什么?
答案 0 :(得分:0)
我能想到的唯一问题是ITestService
合同在WebChannelFactory
客户端代码中不是最新的。
我在测试中注意到你使用WebInvoke
的地方很重要。应始终将WebInvoke
放在ServiceContract
(接口)上,以便WebChannelFactory
在通过REST进行通信时具有正确的URI。如果您将WebInvoke
放在具体类(实现)上,则WebChannelFactory
默认为您在上面观察到的OperationContract
名称。