2011-08-05 337 views
3

我創建了一個公開GetData方法的簡單wcf服務。它實際上是創建新的wcf項目時創建的模板。wcf服務內部服務器錯誤

我添加應用到IIS服務器,因此它可以從外部被訪問,這樣的:http://192.168.0.100/TFSWrapper/Service1.svc

我使用的通用肥皂客戶端發送到GetData方法的請求。這是被生成的SOAP請求:

<?xml version="1.0" encoding="utf-16"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <GetData xmlns="http://tempuri.org/" /> 
    </soap:Body> 
</soap:Envelope> 

這裏是肥皂響應:

<?xml version="1.0" encoding="utf-16"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
    <GetDataResponse xmlns="http://tempuri.org/"> 
     <GetDataResult>You entered: 87</GetDataResult> 
    </GetDataResponse> 
    </s:Body> 
</s:Envelope> 

順便說,我刪除從該方法的參數和硬編碼一個返回值。

正如你所看到的,一切正常,因爲它應該。

接下來,我創建了一個鈦客戶端調用相同的服務。我使用了上面的確切肥皂請求,只是爲了確保。

基本上我這樣做:

var s='<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetData xmlns="http://tempuri.org/" /></soap:Body></soap:Envelope>'; 
     //xhr.send(config.envelopeBegin+body+config.envelopeEnd); 
     xhr.send(s); 

當該被髮送,該服務器與以下故障串一起返回一個「500內部服務器錯誤」響應:

與操作該消息「http://tempuri.org/GetData」不能 處理在接收機處,由於在 EndpointDispatcher一個ContractFilter失配。這可能是因爲發件人和收件人之間的合同不匹配 (發件人和收件人之間的不匹配操作)或綁定/安全 不匹配。檢查發件人和 接收者是否具有相同的合同和相同的綁定(包括 安全要求,例如消息,傳輸,無)。

起初我使用鈦皁api創建請求xml,但我得到了同樣的錯誤。我雖然這是如何創建一個問題,所以這就是爲什麼我硬編碼的請求(工程),但仍然沒有運氣。

+0

Hi Timo!你能提供更多的信息,以便我可以幫助回答你的問題嗎?特別是:您使用的是什麼版本的Titanium Mobile SDK?你正在測試什麼版本的iOS模擬器或Android模擬器?幾天後,我還可以打那臺測試服務器嗎?我會幫你獲得一些工作代碼,或者我會確保報告一個錯誤,以便我們能夠解決任何阻礙你進展的潛在問題。後來! –

回答

2

默認情況下,WCF服務OperationContracts只能使用HTTP POST調用。當您在Titanium HTTPClient上調用open()時,是否爲HTTP方法參數指定了GET或POST?

其次,由於您的服務使用SOAP綁定1.1,你需要傳遞一個SOAPAction頭在你的要求,使WCF能夠將消息路由到GetData方法。如果該服務的OperationContract特性沒有指定動作參數時,動作要由命名空間和服務合同名後面的方法名稱(可能http://tempuri.org/IService1/GetData,如果你用的是什麼默認的WCF應用程序創建)。你還需要指定一個內容類型。所以,你需要設置你的XHR像在此之前調用send:

xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-16'); 
xhr.setRequestHeader('SOAPAction', '"http://tempuri.org/IService1/GetData"'); 
xhr.send(s); 

此外,您還可以顯式地指定一個WCF服務操作的動作:

[OperationContract(Action = "MyAction")] 
string GetData() 
{ 
    // ...snip... 
} 

xhr.setRequestHeader('SOAPAction', '"MyAction"'); 

最後,你可以通過使用[WebGet]屬性修飾方法,允許通過HTTP GET調用服務操作。這允許以REST方式調用操作:http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webgetattribute.aspx