我已经创建了WCF服务,打算在将数据从Android应用发送到MSsql数据库时使用.
该服务已经托管,并且包含2个方法.Data()和GetData(). Data方法用于将JsON POST到,而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 RequestThe 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();
解决方法:
过去,当我这样做时,我使用fiddler2来讲述.Net测试应用程序作为请求发送的内容与AndroID应用程序发送的内容之间的区别.标头中可能存在差异,您的post参数的打包方式等等.此外,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”作为值,当它到达WCF Web方法时应为字符串arg的值.
总结以上是内存溢出为你收集整理的从Android连接到WCF服务-获取405-不允许的方法全部内容,希望文章能够帮你解决从Android连接到WCF服务-获取405-不允许的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)