我突然开始面对以下问题。我的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,但它不起作用。请告知这条线。
答案 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服务的奇怪行为。