从Xamarin调用PutAsJsonAsync的异常

时间:2014-06-15 22:11:10

标签: c# .net xamarin dotnet-httpclient

我正在尝试使用WebApi编写一个小型测试应用程序。我主要使用它,我能够从我的Web服务获取数据并在Android中显示它。

我添加了一个按钮,并使用了我在Winforms测试客户端中使用的相同代码:

   async void buttonSave_Clicked(object sender, EventArgs e)
    {
        HttpClient client = new HttpClient ();
        Customer data = new Customer () {
        Surname = editSurname.Text,
        GivenName = editGivenName.Text};

        var result = await client.PutAsJsonAsync("http://10.0.0.4/WebApplication1/api/Customers/2", data);
       if (result.IsSuccessStatusCode ) {
       labelStatus.Text = "Saved";
       }
    }

这在Windows窗体测试应用程序中工作正常,但在Xamarin应用程序中,我在client.PutAsJsonAsync上得到一个例外:

E / mono-rt(7519):[ERROR]致命未处理的异常:System.TypeLoadException:无法从程序集'System.Net.Http加载'System.Net.Http.ObjectContent`1 [T]'。格式,Version = 5.1.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'。

有什么建议吗?使用Xamarin 3。

编辑:

如果我手动格式化内容,它会起作用:

        string sData =   Newtonsoft.Json.JsonConvert.SerializeObject(data);

        HttpContent content = new System.Net.Http.StringContent(sData, System.Text.Encoding.UTF8,  "application/json") ;
        var result = await client.PutAsync("http://10.0.0.4/WebApplication1/api/Customers/2",content);

据我所见,我的所有参考文献都是正确的。我使用了WebApi Client nuget包。

参考文献:

Newtonsoft.Json
System.Net.Http
System.Net.Http.Extensions
System.Net.Http.Formatting
System.Net.Http.Primitives

3 个答案:

答案 0 :(得分:1)

您需要将以下Nuget包安装到引用您的HttpClient项目的所有项目

  1. Microsoft.Bcl.Build
  2. Microsoft.Bcl
  3. 这些是我构建项目时Visual Studio的警告,在我完成之后,它起作用了!

答案 1 :(得分:1)

将您的数据序列化为JSON字符串,如下所示:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="fast_login_form">
    <div class="fast_login_form_header"> click and hold and move </div>
</div>

<div class="fast_login_form">
    <div class="fast_login_form_header"> click and hold and move </div>
</div>

答案 2 :(得分:0)

MSDN上的System.Net.Http.PutAsJsonAsync方法的重载列表仅显示包含三个或四个参数的重载。在你的例子中,我看到你传递的两个。根据MSDN中的代码示例,当从HttpClient调用实例时,能够省略HttpClient参数似乎是正确的。

然而,使用Xamarin它是作为MonoDevelop的分支构建的。 MonoDevelop使用Mono Framework,它是.NET Framework的一个端口。由于这种差异,我感兴趣的是是否应该为Mono,MonoDevelop或Xamarin打开一个bug。

回到重载方法列表,我建议尝试使用其中一个重载。

  • PutAsJsonAsync(HttpClient,String,T)
  • PutAsJsonAsync(HttpClient,Uri,T)
  • PutAsJsonAsync(HttpClient,String,T,CancellationToken)
  • PutAsJsonAsync(HttpClient,Uri,T,CancellationToken)

我建议尝试将HttpClient传递给PutAsJsonAsync方法,而不要从PutAsJsonAsync的实例调用HttpClient

顺便说一下,这不是一个有保证的解决方案,因为它只是放入评论的信息太多了。希望这会有所帮助。