2014-12-04 57 views
2

我试图想出一种方式发布到Web API控制器与一个对象,但有不同的,处理,对象返回。我找不到解决这个问题的方法。如何从Web API发布返回新类型?

这里是我的方法,我的MVC项目,职位,以我的Web API项目

public dynamic PostStuff<X>(string action, X request) 
     { 
      using (var client = new HttpClient()) 
      { 
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

       var task = client.PostAsJsonAsync(new Uri("host/api/somecontroller/post, request); 
       task.Wait(); 
       var response = task.Result; 

       return response; 

      } 

     } 

这是我的Web API控制器代码

public HttpResponseMessage Post([FromBody] FooObject foo) 
    { 
     var res = Request.CreateResponse(HttpStatusCode.OK, 
      new ValidationResponse<FooObject> 
      { 
       ID = new Random().Next(1000, 1000000), 
       Content = 
        new List<IContent>() 
        { 
         { 
          new Content() 
          { 
           Name = "TheContent", 
           Type = "SomeType", 
           Value = "This is some content for the page : " + foo.Bar 
          } 
         } 
        }, 
       Product = new ProductFoo(), 
       Validated = true 
      }); 
     return res; 
    } 
} 

当我把我的WebAPI控制器代码休息, res变量被正确创建。一旦处理返回到PostStuff方法,我所得到的只是一个StreamResponse,没有在Web API控制器中创建的ValidationResponse对象的跟踪。没有错误,但我不能在回复成功后的回复中使用任何内容。我如何从我的发布方法中提取ValidationResponse?

+0

你不能将'response'转换成'HttpResponseMessage'吗? – alexo 2014-12-04 21:16:34

+0

您应该使用'await'而不是'.Wait()'。 – SLaks 2014-12-04 21:28:00

+0

这也是真的 – alexo 2014-12-04 21:30:40

回答

0

我已经建立了自己这通用功能作为帮手张贴到Web API

使用

var result = PostAsync<MyDataType, MyResultType>("http://...", MyData) 

功能

public async Task<U> PostAsync<T, U>(string url, T model) 
{ 
    using (HttpClient httpClient = new HttpClient(httpHandler)) 
    { 
     var result = await httpClient.PostAsJsonAsync<T>(url, model); 

     if (result.IsSuccessStatusCode == false) 
     { 
      string message = await result.Content.ReadAsStringAsync(); 
      throw new Exception(message); 
     } 
     else 
     { 
      return await result.Content.ReadAsAsync<U>(); 
     } 
    } 
} 

而且HttpClientHandler配置为使用Windows身份验证

protected HttpClientHandler httpHandler = new HttpClientHandler() { PreAuthenticate = true, UseDefaultCredentials = true }; 
+0

你的httpHandler变量是什么?我试过使用这段代码,它永远不会进入IsSuccessStatusCode条件测试。刚刚从result = await行中返回。奇怪的。 – HapiDjus 2014-12-08 21:12:32

+0

这是一个HttpClientHandler,我为Windows身份验证配置,'HttpClientHandler httpHandler =新的HttpClientHandler(){PreAuthenticate = true,UseDefaultCredentials = true};' – 2014-12-09 07:44:05

+1

仍然没有得到我想要的。响应对象,我回去每次看起来是这样的: ID = 1,状态= WaitingForActivation,方法= “{空}”,结果= “{尚未计算}” AsyncState:空 CancellationPending:假 CreationOptions :无 例外:null Id:1 结果:null Status:WaitingForActivation – HapiDjus 2014-12-09 14:54:36

相关问题