2011-03-15 81 views
11

我有一个简单的WCF服务,在我开发机器上测试过的时候工作正常。WCF Web服务错误:“服务端点绑定不使用HTTP协议”?

现在我搬到Web服务到Web服务器,而我在http://mydomain.com:8005运行的服务(在调试模式)。打开一个Web浏览器到该URL显示预期的服务页面,如果我在服务器内部的一个断点上调用它,它会触发断点并返回预期的数据......但在客户端它会返回用下面的错误:

An error occurred while receiving the HTTP response to http://mydomain.com:8005/ . This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.

更多的线索:接口签名是:

IEnumerable<MyClass> GetThings(out string errMsg); 

MyClass何处被定义为序列化的,并且定义是客户端和服务器之间是相同的。

我需要翻转着怎样的秘密开关任何想法?

+0

你是如何托管你的WCF服务?在IIS中? IIS在该机器上的端口8005上运行?另外:请**告诉我们您的**服务端配置 - 我们不能从这里读你的心(或硬盘)..... – 2011-03-15 10:39:14

+1

WCF也需要有**具体类**是传递数据(因为这一切必须是XML序列化的并且必须能够在XML架构中表达 - 界面不适合)。我相信它将无法传回'IEnumerable ' - 尝试使用'List '或具体类型。运气好的话? – 2011-03-15 10:50:18

+1

@marc_s - 自托管,标记为'[Serializable]'和'[DataContract]';所有公共成员都标记为“[DataMember]”。 – 2011-03-15 10:57:41

回答

21

WCF也需要有具体类是传递数据(因为这一切必须是XML序列化的,并且必须是能够被用XML模式表示 - 接口不太合适)。

我相信这不会是能够传回的IEnumerable<T> - 尝试使用List<T>(或T[]阵列)或一个具体类型来代替。

任何运气?

+1

现货 - 谢谢! – 2011-03-15 12:32:02

4

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

如果不能,嗯...我想我已经看到了这个问题,躺在这儿还有。

编辑

虽然没有什么本质上阻止[Serializable接口]会导致您的序列或许处理超过它可以处理。

EDIT 2

marc_s的评论这样做是正确

+1

它被标记为' [Serializable]'和'[DataContract]';所有公共成员都标记为“[DataMember]”。 '[Serializable]'是否会造成任何损害,或者只是没有必要? – 2011-03-15 10:59:00

+0

+1注意''[Serializable]'是不必要的。 – 2011-03-15 11:04:46

8

我有同样的问题,因为我从服务器返回一个疯狂的大量记录,我添加了以下行到我的wcf配置文件,它的工作。

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

我也有一个很大的文件,我已经改变了maxRequestLength,但执行超时没有办法。 – StefanHa 2013-07-25 16:32:37

0

更新你的实体,如果在以前的表进行,也将出现此错误

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

东西,我只是以防万一有人需要它离开这个位置。我遇到了同样的错误。我打电话给我的服务,该服务的参数类型为Dictionary<int, string>,其中一个键/值对的字符串值设置为空。

我改变了代码,以确保没有空值,而且它的工作

0

就面临完全一样的问题,但它是由安全协议类型硬编码到TLS 1.2而服务被部署到2008年服务器,而不R2引起的(和32位引导,这意味着不可升级到R2)。

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

若有人在相同的情况下,有一行这样的代码,你知道为什么你现在得到的错误:

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

我都面临着同样的问题。这是端口地址EndpointAddress的问题。在您的文件的Visual Studio端口地址(例如Service1.svc)中,您的wcf项目的端口地址必须与您输入的端点地址相同EndpointAddress。让我详细描述你的这个解决方案。

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

  1. 在您的WCF项目右键点击你的服务文件(如Service1.svc) - >比在浏览器中的浏览器选择现在查看你的URL喜欢http://localhost:61122/Service1.svc所以现在记下你的端口地址为61122

  2. 右击单击WCF项目 - >比选择属性 - >转到Web选项卡 - >现在服务器sectio ñ - >选择使用Visual Studio开发服务器 - >选择特定端口,给我们在前面从我们Service1.svc服务查找端口地址。那是(61122)

此前我有不同的端口地址。在正确指定端口地址后,我已将其写入EndpointAddress,我的问题已解决。

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