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

Posted

技术标签:

【中文标题】WCF Web 服务错误:“服务端点绑定不使用 HTTP 协议”?【英文标题】:WCF Web Service error: "Service endpoint binding not using HTTP protocol"? 【发布时间】:2011-07-15 16:28:10 【问题描述】:

我有一个简单的 WCF 服务,当我在我的开发机器上进行测试时,它运行良好。

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

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

更多线索:接口签名为:

IEnumerable<MyClass> GetThings(out string errMsg);

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

知道我需要翻转哪些秘密开关吗?

【问题讨论】:

您如何托管您的 WCF 服务?在 IIS 中? IIS 是否在那台机器上的 8005 端口上运行?另外:请向我们展示您的服务端配置 - 我们无法从这里读取您的想法(或硬盘)..... WCF 还需要有 具体类 来传递数据(因为它都需要 XML 序列化并且必须能够在 XML 模式中表示 - 接口不是' t 非常适合)。我相信它无法回传IEnumerable&lt;T&gt; - 尝试使用List&lt;T&gt; 或具体类型。运气好吗? @marc_s - 自托管,标记为[Serializable][DataContract];所有标记为[DataMember]的公共成员。 @marc_s - 具体的类注释就是答案。请提出它作为我将其标记为正确的答案。谢谢! 完成 - 谢谢!很高兴我能提供帮助 【参考方案1】:

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

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

运气好吗?

【讨论】:

【参考方案2】:

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

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

【讨论】:

我也有一个大文件,我已经更改了 maxRequestLength 但 executionTimeout 成功了。【参考方案3】:

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

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

编辑

虽然没有什么固有的阻塞 [Serializable] 会导致您的序列化处理可能超出它的处理能力。

编辑 2

marc_s 的评论说对了

【讨论】:

标记为[Serializable][DataContract];标记为[DataMember] 的所有公共成员。 [Serializable] 会造成任何损害,还是只是没有必要?【参考方案4】:

晚会的答案,但我得到了同样的错误。

事实证明,您不能对数据契约成员使用抽象类。我必须使用以下内容:

[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();

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

我只是把它留在这里,以防有人需要它。我遇到了同样的错误。我正在调用我的服务,它的参数类型为 Dictionary&lt;int, string&gt;,并且其中一个键/值对将字符串值设置为 null。

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

【讨论】:

有点类似,我的问题是我有一个只读属性(getter 没有 setter)。【参考方案7】:

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

对于其他任何人来说,这是一个非常不可能的情况,但我想我会提到。

如果有人遇到同样的情况并且有这样一行代码,那么你现在就知道为什么会出现错误了:

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

【讨论】:

【参考方案8】:

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

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

    在您的 WCF 项目中,右键单击您的服务文件(例如 Service1.svc)-> 现在在您的浏览器中选择 在浏览器中查看,您的 URL 类似于 http://localhost:61122/Service1.svc 现在记下您的端口地址为 61122

    右键单击您的 wcf 项目 -> 选择 属性 -> 转到 Web 选项卡 -> 现在在 服务器部分 -> 选择 Use Visual Studio Development Server -> 选择 Specific Port 并给出我们之前从 Service1.svc 服务中找到的端口地址。那是(61122)

之前我有不同的端口地址。在正确指定我已提供给 EndpointAddress 的端口地址后,我的问题就解决了。

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

【讨论】:

以上是关于WCF Web 服务错误:“服务端点绑定不使用 HTTP 协议”?的主要内容,如果未能解决你的问题,请参考以下文章

客户端的 WCF Web 服务自定义异常错误

调用 Sitefinity WCF Web 服务时出现错误 401

调用 WCF Web 服务时出现错误的 Json 响应

大型 WCF Web 服务请求因 (400) HTTP 错误请求而失败

WCF Web 服务错误:无法激活该服务,因为它不支持 ASP.NET 兼容性

WCF - 远程服务器返回意外响应:(400)错误请求