WCF Web服务错误:“服务端点绑定不使用HTTP协议”?

时间:2011-03-15 10:27:45

标签: c# .net wcf exception-handling wcf-binding

我有一个简单的WCF服务,在我的开发机器上进行测试时工作正常。

现在我已将Web服务移动到Web服务器,并且我正在http://mydomain.com:8005运行该服务(在调试模式下)。打开Web浏览器到该URL显示预期的服务页面,如果我在我正在调用的接口内的服务器上放置一个断点,它会命中断点并返回预期的数据......但是在客户端它返回出现以下错误:

  

接收到http://mydomain.com:8005/的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。

更多线索:界面签名是:

IEnumerable<MyClass> GetThings(out string errMsg);

其中MyClass定义为Serializable,客户端和服务器之间的定义相同。

任何想法我需要翻转什么秘密开关?

8 个答案:

答案 0 :(得分:22)

WCF还需要具有具体类来传递数据(因为它都需要是XML可序列化的,并且必须能够以XML模式表示 - 接口不太适合)。

我相信它无法传回IEnumerable<T> - 请尝试使用List<T>(或T[]数组)或具体类型。

运气好吗?

答案 1 :(得分:8)

我遇到了同样的问题,因为我从服务器返回了大量的记录,我将以下行添加到我的wcf配置文件中并且有效。

<system.web>
    <httpRuntime maxRequestLength ="262144" executionTimeout="103600"/>
</system.web>

答案 2 :(得分:4)

不要将MyClass定义为Serializable。将其标记为[DataContract],将其属性标记为[DataMember]。

如果你不能,那么......我想我也在这里看到了这个问题。

修改

虽然没有任何固有的阻塞[Serializable]会导致序列化处理的次数超过它可以处理的次数。

编辑2

marc_s的评论是正确的

答案 3 :(得分:2)

派对的迟到答案,但我得到了同样的错误。

事实证明,您不能将抽象类用于数据协定成员。我不得不使用以下内容:

[DataContract]
public class MyClass {
    [DataMember]
    public A MyProperty { get; set; }
}

[DataContract]
[KnownType(typeof(B))]
[KnownType(typeof(C))]
public class A {

}

[DataContract]
public class B : A {

}

[DataContract]
public class C : A {

}

为了允许WCF序列化像

这样的东西
var myClass = new MyClass();
myClass.MyProperty = new B();

答案 4 :(得分:0)

如果您之前的表格中有任何更改并且未更新您的实体,则更新您的实体也会发生此错误

答案 5 :(得分:0)

我只是留在这里,万一有人需要它。我遇到了同样的错误。我正在调用我的服务,该服务的参数类型为Dictionary<int, string>,其中一个键/值对的字符串值设置为null。

我更改了代码以确保没有空值并且它有效

答案 6 :(得分:0)

刚遇到完全相同的问题,但它是由安全协议类型硬编码到TLS 1.2引起的,而服务部署到没有R2的服务器(32位启动,这意味着不可升级到R2)。

对于其他任何人来说,这是一个非常不可能的场景,但我想提一下。

如果有人处于相同的情况并且有这样的代码行,你知道为什么你现在收到错误:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

答案 7 :(得分:0)

我遇到了同样的问题。这是 EndpointAddress 的端口地址问题。在Visual Studio中,文件的端口地址(例如Service1.svc)和wcf项目的端口地址必须与 EndpointAddress 中的端口地址相同。让我详细描述一下这个解决方案。

检查端口地址有两个步骤。

  1. 在您的WCF项目中右键单击您的服务文件(例如Service1.svc) - &gt;现在在您的浏览器中选择在浏览器中查看,您需要 http://localhost:61122/Service1.svc ,所以现在记下您的端口地址为61122 < / p>

  2. 右击你的wcf项目 - &gt;而不是选择属性 - &gt;转到网络标签 - &gt;现在位于服务器部分 - &gt;选择使用Visual Studio开发服务器 - &gt;选择特定端口并提供我们之前从Service1.svc服务中找到的端口地址。那是(61122)

  3. 之前我有不同的端口地址。正确指定端口地址后我已经在 EndpointAddress 中,我的问题解决了。

    我希望这可以解决你的问题。