WCF REST服务存在奇怪的错误

时间:2014-01-13 14:41:42

标签: .net wcf rest

我突然开始面对以下问题。我的REST服务不再适用。它在一段时间前工作,我没有对配置进行任何更改。突然之间,它表现得很奇怪。我使用WCF测试客户端来检查问题,奇怪的是,服务方法被调用了6次,最后抛出了以下错误。

错误:无法从http://localhost:49796/Test.svc/GetInformation?memberId=1获取元数据如果这是您有权访问的Windows(R)Communication Foundation服务,请检查您是否已在指定地址启用了元数据发布。有关启用元数据发布的帮助,请参阅http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange错误URI上的MSDN文档:http://localhost:49796/Test.svc/GetInformation?memberId=1元数据包含无法解析的引用:“http://localhost:49796/Test.svc/GetInformation?memberId=1”。远程服务器返回意外响应:(405)方法不允许。远程服务器返回错误:(405)Method Not Allowed.HTTP GET错误URI:

  

http://localhost:49796/Test.svc/GetInformation?memberId=1

There was an error downloading 'http://localhost:49796/Test.svc/GetInformation?memberId=1'.    The underlying connection was closed: An unexpected error occurred on a receive.    Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.    An existing connection was forcibly closed by the remote host

最令人惊讶的部分是即使我创建新服务或测试旧服务也是如此。我的电脑全球出了什么问题?由于我的电脑中的所有WCF REST服务都表现相同,因此某些地方似乎存在某些文件损坏或配置更改。我用Google搜索但找不到合适的答案。

我尝试删除终点并使用Test Client再次测试。由于测试客户端自动添加basichttpbinding,因此使用测试客户端工作正常。

如果有人知道,请告知修复。

我的配置如下所示:

<system.serviceModel>
<services>
  <service name="TestService.ServiceLayer.Services.TestService" behaviorConfiguration="TestBehavior">
    <endpoint address="" binding="webHttpBinding" 
              contract="TestService.ServiceLayer.Services.ITestService" behaviorConfiguration="web" />
   </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="web">
      <webHttp />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="TestBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

我的服务合同如下

 [ServiceContract]
public interface ITestService
{
    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetInformation?memberId={memberId}")]
    List<MyTestClass> GetInformation(string memberId);
}

我进一步分析并发现如果我将List更改为字符串,它可以正常工作。我在服务合同之上添加了KnownType,但它不起作用。请告知这条线。

3 个答案:

答案 0 :(得分:0)

在您的配置中,我没有看到Mex绑定。没有它,我认为元数据不能从服务中获得。 Mex指的是mexHttpBinding

粗略地说,它看起来像这样:

<services>
   <service name="MyService" behaviorConfiguration="MEX">
    <endpoint
       address="http://localhost:8000/MEX"
       binding="mexHttpBinding"
       contract="IMetadataExchange"        />
    </service>
</services>

<behaviors>
   <serviceBehaviors>
      <behavior name="MEX">
        <serviceMetadata/>
      </behavior>
    </serviceBehaviors>
</behaviors>

答案 1 :(得分:0)

启用wcf跟踪并查看SvcTraceViewer.exe中的跟踪日志。请查看以下链接,了解如何在wcf中启用跟踪。

4 simple steps to enable tracing in WCF

如何使用SvcTraceViewer

Using Service Trace Viewer for Viewing Correlated Traces and Troubleshooting

答案 2 :(得分:0)

决议令人兴奋。我看到DB中的一个数据契约字段是NULL,但它在C#中不是Nullable类型。这导致了我的REST服务的奇怪行为。