2011-03-24 72 views
3

我創建了一個WCF服務,我打算在從Android應用程序向MSSQL數據庫發送數據時使用它。連接到Android的WCF服務 - 獲取405 - 不允許的方法

該服務已經託管幷包含2個方法.. Data()和GetData()。 Data方法用於POST JSON,而GetData只返回一個字符串。

我已經試過如下:

我的數據合同:

[OperationContract] 
[WebInvoke(Method = "POST", 
UriTemplate = "/Data", 
RequestFormat = WebMessageFormat.Json, 
ResponseFormat = WebMessageFormat.Json, 
BodyStyle = WebMessageBodyStyle.Wrapped)] 
string Data(Data test); 

我的Android代碼:

HttpPost request = new HttpPost("http://lino.herter.dk/Service.svc/Data"); 
try { 
JSONObject json = new JSONObject(); 
json.put("year", 2011); 
StringEntity entity = new StringEntity(json.toString()); 

entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
request.setEntity(entity); 

DefaultHttpClient httpClient = new DefaultHttpClient(); 
HttpResponse response = httpClient.execute(request); 
Log.i("!!! WebInvoke", response.getStatusLine().toString()); 

if(response!=null) { 
InputStream in = response.getEntity().getContent(); //Get the data in the entity' 
Log.i("TEST", convertStreamToString(in)); 
} 

類似的方法工作只是罰款的GetData ..但是調用數據方法返回:

400 Bad Request 
The server encountered an error processing the request. The exception message is 'Object reference not set to an instance of an object.'. 

Web.Config中看起來像這樣:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <customErrors mode="Off"/> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="jsonBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service name="WcfEA.Service"> 
     <endpoint address="" behaviorConfiguration="jsonBehavior" binding="webHttpBinding" contract="WcfEA.IService" /> 
     </service> 
    </services> 
    </system.serviceModel> 
</configuration> 

數據方法設置爲接收一個 「數據」 對象:

[DataContract] 
public class Data 
{ 
    [DataMember(Name = "year")] 
    public int Year 
    { 
     get; 
     set; 
    } 
} 

和Data方法只做1個操作:

return data.year.toString(); 

回答

1

當我在過去做過這些事情時,我使用Fiddler2來說明我的.Net測試應用程序作爲請求發送的內容和我的Android應用程序發送的內容之間的區別。頭文件中可能存在差異,包裝後參數的打包方式等。另外,Fiddler2會顯示響應和響應代碼。這應該給你所需的所有信息來弄清楚。

http://www.fiddler2.com/fiddler2/

編輯

在評論中說來回後,這裏是什麼,我相信你的問題是一個更新的答案。

我無法找到原始POC的代碼,我在Android客戶端和WCF服務之間進行通信,但是我發現了其他一些代碼,我發佈了json數據。我所做的與你的不同之處似乎在於,我將有效負載作爲名稱/值對傳遞,因此當它到達服務時就被鎖定了。您似乎只傳遞了一串原始json數據,因此服務可能希望您的json數據作爲名稱 - 值對中的值,並由您的服務中的參數名稱來確定。

要解釋這兩種方法,這裏是您使用傳遞原始字符串數據作爲實體的方法。

JSONObject json = new JSONObject(); 
json.put("year", 2011); 
StringEntity entity = new StringEntity(json.toString()); 
request.setEntity(entity); 

這裏是我張貼的的NameValuePair我的數據的一個例子

List<NameValuePair> params = new ArrayList<NameValuePair>(1); 
params.add(new BasicNameValuePair("SomeKey", someJsonString)); 
request.setEntity(new UrlEncodedFormEntity(params)); 

如果你想通過一個複雜的對象,你可以建立起來作爲一個JSON字符串作爲我的榜樣利用以上。或者...你可以簡單地通過「年」作爲鍵和「2011」作爲值,這應該是你的字符串參數的值,當它到達你的WCF網絡方法。

+0

嗨..我改變了原來的帖子,但你的評論仍然是非常有效的..但我怎麼看我的Android應用程序請求?提琴手似乎沒有抓住它..:/ – Herter 2011-03-27 21:27:38

+0

我不知道任何方式捕捉數據在Android設備上的方式Fiddler在PC上工作,但你可以在你的網絡服務器內的Data方法做一些記錄。快速而骯髒的方法是轉儲值參數並通過Headers將其轉儲到字符串中。將其寫入到Web服務器上的文本文件中,並設置一個讀取並輸出該文件的常規aspx頁面。從您的測試應用程序請求,然後刷新頁面。從您的Android應用請求並再次刷新。您將能夠看到不同請求中的差異。 – Rich 2011-03-28 10:25:31

+0

我已經在Linux上安裝Wireshark(我的開發電腦),它似乎做的工作.. – Herter 2011-03-28 10:40:03

1

<?xml version=\"1.0\"?>之後不應該有換行嗎?另外,除非在發送到服務器之前確實需要驗證XML,否則建議您僅將實體附加爲文本(跳過xml內容類型等)並在服務器上解析XML。

這是因爲您總是在使用來解析和驗證服務器上的傳入數據,否則會帶來巨大的安全風險。除非您想要通過拒絕不正確格式化的XML來保存請求 -

另外,您確定您的XML使用的是有效的SOAP請求XML格式嗎?由於您的標題指示消息爲SOAP,因此內容應該採用格式正確的SOAP XML ...

+0

嘿..謝謝你的答案..我已更新原始帖子,以反映我最新的代碼。 – Herter 2011-04-04 13:04:55

1

您可以將您的web.config文件發佈到C#WCF嗎?有一段時間我創建了一個充當WebService的WCF服務器,並且我遇到了同樣的問題,並且都是關於配置。除了執行配置,如果你默認使用wsHttpBinding託管一個WCF服務,它將打開'Windows'autentification。你是如何創建這項服務的?

+0

將Web.Config和最新的代碼添加到原始帖子中。 – Herter 2011-04-04 13:05:18