C# 如何从Web API post返回新类型?

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

我试图想出一种方法,用一个对象向Web API控制器发送消息,但返回的对象不同,经过处理。我所能找到的方法都没有解决这个问题

下面是我在MVC项目中发布到WebAPI项目的方法

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 };