我有一个简单的 WCF 服务,在我的开发机器上进行测试时运行良好。
现在我已将 Web 服务移至 Web 服务器,并在 http://mydomain.com:8005 运行该服务(以调试模式)。打开该 URL 的 Web 浏览器会显示预期的服务页面,如果我在我调用的接口内的服务器上放置断点,它会命中断点并返回预期的数据...但在客户端它会返回出现以下错误:
接收对 http://mydomain.com:8005/ 的 HTTP 响应时发生错误。这可能是由于服务端点绑定不使用 HTTP 协议。这也可能是由于服务器中止 HTTP 请求上下文(可能是由于服务关闭)。有关更多详细信息,请参阅服务器日志。
更多线索:接口签名为:
IEnumerable<MyClass> GetThings(out string errMsg);
其中
MyClass
被定义为可序列化,并且客户端和服务器之间的定义是相同的。
有什么想法我需要打开什么秘密开关吗?
WCF 还需要有具体类来传递数据(因为所有这些都需要是 XML 可序列化的,并且必须能够以 XML 模式表示 - 接口不太适合)。
我相信它无法传回
IEnumerable<T>
- 尝试使用 List<T>
(或 T[]
数组)或具体类型来代替。
有运气吗?
我遇到了同样的问题,因为我从服务器返回了大量记录,我将以下行添加到我的 wcf 配置文件中并且它起作用了。
<system.web>
<httpRuntime maxRequestLength ="262144" executionTimeout="103600"/>
</system.web>
不要将 MyClass 定义为可序列化。将其标记为 [DataContract] 并将其属性标记为 [DataMember]。
如果你不能,那么......我想我也在这里看到了这个问题。
编辑
虽然没有什么本质上阻塞的[Serialized]会导致你的序列化处理的数据可能超出它的处理能力。
编辑2
marc_s 的评论说得对
迟到的答复,但我得到了同样的错误。
事实证明,您不能对数据协定成员使用抽象类。我必须使用以下内容:
[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();
如果您之前的表中进行了任何更改并且未更新您的实体,则更新您的实体也会发生此错误
我只是把它留在这里以防万一有人需要它。我遇到了同样的错误。我正在调用我的服务,该服务有一个类型为
Dictionary<int, string>
的参数,并且其中一个键/值对的字符串值设置为 null。
我更改了代码以确保不存在空值并且它有效
刚刚遇到了完全相同的问题,但这是由硬编码为
TLS 1.2
的安全协议类型引起的,而服务部署到没有 R2 的 2008 服务器(32 位启动,这意味着无法升级到 R2)。
对于其他人来说,这是一种非常不可能的情况,但我想我会提到。
如果有人处于同样的情况并且有一行这样的代码,那么您现在就知道为什么会收到错误:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
我也遇到过同样的问题。是EndpointAddress的端口地址问题。在 Visual Studio 中,文件的端口地址(例如 Service1.svc)和 wcf 项目的端口地址必须与您在 EndpointAddress 中提供的端口地址相同。让我详细向您描述这个解决方案。
检查端口地址有两个步骤。
在您的WCF项目中右键单击您的服务文件(例如Service1.svc) - >然后选择在浏览器中查看现在在您的浏览器中您有像http://localhost:61122/Service1.svc这样的url现在记下您的端口地址 为 61122
右键单击您的 wcf 项目 -> 选择 Properties -> 转到 Web 选项卡 -> 现在在 Servers 部分 -> 选择 Use Visual Studio Development Server -> 选择 Specific Port 并给出我们之前从 Service1.svc 服务中找到的端口地址。那是 (61122)。
之前我有不同的端口地址。在正确指定端口地址(我已将其输入到EndpointAddress中)后,我的问题得到了解决。
我希望这可以解决您的问题。
当我将项目升级到 .NET Framework 4.8.1 后开始收到此错误时,情况有所不同。我所要做的就是将 .netFramework 包含在 httpRuntime 中,如下所示:
<httpRuntime targetFramework="4.8.1" maxRequestLength=