2011-03-15 83 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,我的問題已解決。

我希望這可以解決您的問題。