0

我正在尝试将保存在 android 手机上的用户的一些信息保存到 WCF 服务。我从手机收到 400 错误,当我尝试使用 fiddler 向服务器发送相同的请求时(在我的本地主机上测试时),我的 Visual Studio 在我的保存方法中弹出一个空指针。我正在按照这个例子来发球,它只是不工作:教程

这是我的一些代码:这是我在 WCF 服务中的用户对象:

[DataContract]
public class User
{
    [DataMember(Name= "userid")]
    public int UserId { get; set; }
    [DataMember(Name = "username")]
    public string username { get; set; }
    [DataMember(Name = "password")]
    public string password { get; set; }
    [DataMember(Name = "information")]
    public Byte[] information { get; set; }
}

我的 IService 中的操作合同

    [OperationContract]
    [WebInvoke(Method = "POST",
        BodyStyle = WebMessageBodyStyle.Bare, 
        ResponseFormat = WebMessageFormat.Xml, 
        RequestFormat= WebMessageFormat.Json,
        UriTemplate = "saveUser")]
    Boolean saveUser(User user);

^ 此方法抛出空指针,因为用户为空。我尝试将 WebMessageBodyStyle 更改为 WrappedRequest 但这没有帮助。

下面是发送 POST 请求的 android 代码:

JSONStringer user = new JSONStringer()
                .object()
                    .key("user").object()
                    .key("userid").value("1").key("username").value(appState.getCurrentUser().username)
                        .key("password").value(appState.getCurrentUser().password)
                        .key("information").value(str.toString())
                    .endObject()
                .endObject();
            StringEntity entity = new StringEntity(user.toString());
            HttpPost request = new HttpPost(new URI(url));
            request.setHeader(HTTP.CONTENT_TYPE, "application/json");
            request.setHeader("Accept", "application/json");

            request.setEntity(entity);
HttpResponse response = httpClient.execute(request);

^ 响应是来自服务器的 400 错误。

这是将 json 发送到 localhost 的提琴手: 这是 我添加内容长度的图片,但在图片中显示为 0。它确实是 86。任何帮助将不胜感激。

4

3 回答 3

0

尝试从Fiddler执行 POST 请求,您的请求应如下所示:

POST http://localhost/SampleApp/Service1.svc/saveUser HTTP/1.1
Content-Type: application/json
Host: localhost

{"userid":1,"username":"testuser","password":"testpassword","information":null}
于 2012-04-27T09:43:01.090 回答
0

如果你看看我是如何发送 byte[] 的,它实际上是一个字符串,当 JSON 对象到达服务时,服务无法确定将这个信息字符串放在哪里。找到这个后,我觉得自己完全是个菜鸟。

于 2012-05-01T03:46:31.900 回答
0

有时Bad request是错误的错误。例如,如果您在 WCF 服务器端有一个WritePermissionException ,您可能会收到此Bad request。它可能会让您感到困惑,并让您怀疑您的 JSON 字符串或与您的请求相关的内容,但确实该项目导致的错误是无关紧要的。我花了很多时间来调试这个该死的错误请求。所以在我看来:

解决此错误的最佳方法是:

  • 在 wcf 服务的 web.config 文件中启用诊断配置。

<system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> <listeners> <add name="xml" /> </listeners> </source> <source name="System.ServiceModel.MessageLogging"> <listeners> <add name="xml" /> </listeners> </source> <source name="myUserTraceSource" switchValue="Information, ActivityTracing"> <listeners> <add name="xml" /> </listeners> </source> </sources> <sharedListeners> <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="Traces.svclog" /> </sharedListeners> </system.diagnostics>

  • 然后,如果您有来自 wcf 的发布,请将其托管在本地 IIS 上,然后在本地调用它

注意:要调用 REST wcf 方法,您可以使用REST 客户端(例如,高级 REST 客户端),它们可作为 chrome/firefox 中的扩展使用。

于 2015-04-24T19:52:36.187 回答