我正在尝试想出一种方法来使用一个对象发布到 Web API Controller ,但返回一个不同的、已处理的对象。我找到的所有方法都没有解决问题。
这是我的 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 Controller 代码
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 Controller 代码中放置一个中断时,res 变量被正确创建。一旦处理返回到 PostStuff 方法,我得到的只是一个 StreamResponse,没有在 Web API Controller 中创建的 ValidationResponse 对象的踪迹。没有错误,但除了帖子成功之外,我不能在响应中使用任何内容。如何从我的发布方法中提取 ValidationResponse?
我自己构建了这个通用函数作为 POST 到 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 Auth 配置
protected HttpClientHandler httpHandler = new HttpClientHandler() { PreAuthenticate = true, UseDefaultCredentials = true };
我是一名优秀的程序员,十分优秀!