我有一个简单的WCF服务,在我的开发机器上进行测试时工作正常。
现在我已将Web服务移动到Web服务器,并且我正在http://mydomain.com:8005运行该服务(在调试模式下)。打开Web浏览器到该URL显示预期的服务页面,如果我在我正在调用的接口内的服务器上放置一个断点,它会命中断点并返回预期的数据......但是在客户端它返回出现以下错误:
接收到http://mydomain.com:8005/的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。
更多线索:界面签名是:
IEnumerable<MyClass> GetThings(out string errMsg);
其中MyClass
定义为Serializable,客户端和服务器之间的定义相同。
任何想法我需要翻转什么秘密开关?
答案 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 中的端口地址相同。让我详细描述一下这个解决方案。
检查端口地址有两个步骤。
在您的WCF项目中右键单击您的服务文件(例如Service1.svc) - &gt;现在在您的浏览器中选择在浏览器中查看,您需要 http://localhost:61122/Service1.svc ,所以现在记下您的端口地址为61122 < / p>
右击你的wcf项目 - &gt;而不是选择属性 - &gt;转到网络标签 - &gt;现在位于服务器部分 - &gt;选择使用Visual Studio开发服务器 - &gt;选择特定端口并提供我们之前从Service1.svc服务中找到的端口地址。那是(61122)。
之前我有不同的端口地址。正确指定端口地址后我已经在 EndpointAddress 中,我的问题解决了。
我希望这可以解决你的问题。