我创建了一个WCF服务,我打算在将数据从Android应用程序发送到MSSQL数据库时使用。
该服务已托管,包含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 ..但调用Data方法返回:
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>
Data方法设置为接收“Data”对象:
[DataContract]
public class Data
{
[DataMember(Name = "year")]
public int Year
{
get;
set;
}
}
并且Data方法只执行1次操作:
return data.year.toString();
答案 0 :(得分:1)
当我过去这样做时,我使用Fiddler2来区分我的.Net测试应用程序作为请求发送的内容与我的Android应用程序发送的内容之间的区别。标题中可能存在差异,邮件参数的打包方式等。此外,Fiddler2将显示响应和响应代码。这应该为您提供了解决所需的所有信息。
http://www.fiddler2.com/fiddler2/
修改强>
在评论中来回发言后,这里是我认为您的问题的最新答案。
我无法找到我在Android客户端和WCF服务之间进行通信所做的原始POC的代码,但我确实找到了一些其他代码,我发布了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字符串,如我的示例所使用的那样。或者......您可以简单地将“year”作为键,将“2011”作为值传递,这应该是字符串arg到达WCF Web方法时的值。
答案 1 :(得分:1)
<?xml version=\"1.0\"?>
之后不应该有换行符吗?
此外,除非您确实需要在发送到服务器之前验证XML,否则建议您只是将实体作为文本附加(跳过xml内容类型等)并在服务器上解析XML。
这是因为总是无论如何都会解析和验证服务器上的进入数据,否则会带来巨大的安全风险。除非你想通过像这样拒绝不正确格式化的XML来保存请求往返......
另外,您确定您的XML是否采用有效的SOAP请求XML格式?由于您的标头指示消息是SOAP,因此内容应该是格式正确的SOAP XML ...
答案 2 :(得分:1)
你可以从c#WCF发布你的web.config吗?有一段时间我创建了一个充当WebService的WCF服务器,我遇到了同样的问题,而这一切都与配置有关。除了initakl配置,如果您在默认情况下使用wsHttpBinding托管WCF服务,它将启用“Windows”身份验证。你是如何创建服务的?