从Android连接到WCF服务-获取405-不允许的方法

从Android连接到WCF服务-获取405-不允许的方法,第1张

概述我已经创建了WCF服务,打算在将数据从Android应用发送到MSSQL数据库时使用.该服务已经托管,并且包含2个方法.Data()和GetData().Data方法用于将JSONPOST到,而GetData仅返回一个字符串.我尝试了以下方法:我的数据合同:[OperationContract][WebInvoke(Method="POST",UriTempl

我已经创建了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-不允许的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1071805.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存