C# 如何从Web API post返回新类型?
我试图想出一种方法,用一个对象向Web API控制器发送消息,但返回的对象不同,经过处理。我所能找到的方法都没有解决这个问题 下面是我在MVC项目中发布到WebAPI项目的方法C# 如何从Web API post返回新类型?,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我试图想出一种方法,用一个对象向Web API控制器发送消息,但返回的对象不同,经过处理。我所能找到的方法都没有解决这个问题 下面是我在MVC项目中发布到WebAPI项目的方法 public dynamic PostStuff<X>(string action, X request) { using (var client = new HttpClient()) { client.Defa
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;
}
}
公共动态PostStuff(字符串操作,X请求)
{
使用(var client=new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
var task=client.PostAsJsonAsync(新Uri(“主机/api/somecontroller/post,请求”);
task.Wait();
var response=task.Result;
返回响应;
}
}
这是我的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;
}
}
public-httpresponsemessagepost([FromBody]foooobject-foo)
{
var res=Request.CreateResponse(HttpStatusCode.OK,
新的ValidationResponse
{
ID=new Random()。下一步(10001000000),
内容=
新名单()
{
{
新内容()
{
Name=“内容”,
Type=“SomeType”,
Value=“这是页面的一些内容:”+foo.Bar
}
}
},
Product=新产品foo(),
已验证=真
});
返回res;
}
}
当我在WebAPI控制器代码中插入中断符时,res变量被正确创建。一旦处理返回到PostStuff方法,我得到的只是一个StreamResponse,没有在Web API控制器中创建的ValidationResponse对象的痕迹。没有错误,但除了post成功之外,我不能在响应中使用任何东西。如何从我的发布方法中提取ValidationResponse?我自己构建了这个通用函数,作为发布到Web API的助手
用法
您不能将该响应
转换为HttpResponseMessage
?您应该使用Wait
而不是.Wait()
。它已经作为HttpResponseMessage返回。即使我从控制器返回自定义类型,PostSJSonasync始终返回一个HttpResponseMessage,其中不包含我需要的数据。是否还有其他东西可以用来完成post->return new type->在我的页面任务中使用它?此外,我还收到一条声明HttpResponseMessage的消息如果我尝试使用Wait vs task.Wait()的话,年龄是不可等待的;您的httpHandler变量中有什么?我尝试使用此代码,但它从未进入IsSuccessStatusCode条件测试。只是从result=wait行中直接返回。奇怪。我正在为Windows Auth配置HttpClientHandler,HttpClientHandler=new HttpClientHandler(){PreAuthenticate=true,UseDefaultCredentials=true};
仍然没有得到我想要的。我每次返回的响应对象如下所示:Id=1,Status=WaitingForActivation,Method=“{null}”,Result=“{not culated}”“AsyncState:null CancellationPending:false CreationOptions:None异常:null Id:1结果:null状态:WaitingForActivation@HapiDjus这是任务类型的结果。您需要等待或获取ReadAsStringAsync()的结果。
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>();
}
}
}
protected HttpClientHandler httpHandler = new HttpClientHandler() { PreAuthenticate = true, UseDefaultCredentials = true };