2013-12-10 76 views
1

我有一个自定义DTO类:发布自定义类型与HttpClient的

public class myObject 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

和使用控制器的Web API(4.5 .NET框架)

[HttpPost] 
public IHttpActionResult StripArchiveMailboxPermissions(myObject param) 
{ 
    DoSomething(param); 
    return OK(); 
} 

的客户端只有4.0 .NET框架所以我不能使用PostAsJsonAsync()方法。将客户端传递给服务器的解决方案是什么?像下面

我已经试过somethinig:

var response = Client.SendAsync(new HttpRequestMessage<myObject>(objectTest)).Result; 

但它引发了我的异常:

Could not load file or assembly 'Microsoft.Json, Version=2.0.0.0, 
Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. 
The system cannot find the file specified. 

是不是可以使用Newtonsoft.Json库?

回答

5

当然。只是自己创建一个新的HttpContent类这样的...

public class JsonContent : HttpContent 
    { 

     private readonly MemoryStream _Stream = new MemoryStream(); 

     public JsonContent(object value) 
     { 

      var jw = new JsonTextWriter(new StreamWriter(_Stream)) {Formatting = Formatting.Indented}; 
      var serializer = new JsonSerializer(); 
      serializer.Serialize(jw, value); 
      jw.Flush(); 
      _Stream.Position = 0; 

     } 
     protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) 
     { 
      _Stream.CopyTo(stream); 
      var tcs = new TaskCompletionSource<object>(); 
      tcs.SetResult(null); 
      return tcs.Task; 
     } 

     protected override bool TryComputeLength(out long length) 
     { 
      length = _Stream.Length; 
      return true; 
     } 
    } 

,现在你可以把你的对象为JSON就这样

var content = new JsonContent(new YourObject()); 
    var httpClient = new HttpClient(); 
    var response = httpClient.PostAsync("http://example.org/somewhere", content); 
+0

感谢您的解决方案。我不确定SerializeToStreamAsync是干什么的,TaskCompletionSource需要结果值的类型。它应该是输入对象还是输出对象? – user1542666

+0

@ user1542666对不起,我不得不从.net45转换为4.0,并忘记了''。当HttpClient需要时,SerializeToStream方法会将缓冲流复制到网络流。 –

相关问题