我創建了一個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();
嗨..我改變了原來的帖子,但你的評論仍然是非常有效的..但我怎麼看我的Android應用程序請求?提琴手似乎沒有抓住它..:/ – Herter 2011-03-27 21:27:38
我不知道任何方式捕捉數據在Android設備上的方式Fiddler在PC上工作,但你可以在你的網絡服務器內的Data方法做一些記錄。快速而骯髒的方法是轉儲值參數並通過Headers將其轉儲到字符串中。將其寫入到Web服務器上的文本文件中,並設置一個讀取並輸出該文件的常規aspx頁面。從您的測試應用程序請求,然後刷新頁面。從您的Android應用請求並再次刷新。您將能夠看到不同請求中的差異。 – Rich 2011-03-28 10:25:31
我已經在Linux上安裝Wireshark(我的開發電腦),它似乎做的工作.. – Herter 2011-03-28 10:40:03