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<T>
- 尝试使用List<T>
或具体类型。运气好吗?
@marc_s - 自托管,标记为[Serializable]
和[DataContract]
;所有标记为[DataMember]
的公共成员。
@marc_s - 具体的类注释就是答案。请提出它作为我将其标记为正确的答案。谢谢!
完成 - 谢谢!很高兴我能提供帮助
【参考方案1】:
WCF 还需要有具体的类 来传递数据(因为它都需要是 XML 可序列化的,并且必须能够以 XML 模式表示 - 接口不太适合)。
我相信它无法传回 IEnumerable<T>
- 请尝试使用 List<T>
(或 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<int, string>
,并且其中一个键/值对将字符串值设置为 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 协议”?的主要内容,如果未能解决你的问题,请参考以下文章
调用 Sitefinity WCF Web 服务时出现错误 401
大型 WCF Web 服务请求因 (400) HTTP 错误请求而失败