Asp.net mvc 4 MVC正交法

Asp.net mvc 4 MVC正交法,asp.net-mvc-4,asynchronous,async-await,httpclient,Asp.net Mvc 4,Asynchronous,Async Await,Httpclient,我正在从事一个MVC项目,该项目通过第三方提交请求 在我的控制器中,我有一个SubmitClaims()操作,它接收ajax请求,然后调用RunAsync()。RunAsync使用HttpClient提交请求。 我不确定我在这里做的事情是否正确 我还有两个版本的SubmitClaims(),都可以使用。但我不知道哪个版本更好 版本1 [HttpPost] public async Task<string> SubmitClaims() { st

我正在从事一个MVC项目,该项目通过第三方提交请求

在我的控制器中,我有一个SubmitClaims()操作,它接收ajax请求,然后调用RunAsync()。RunAsync使用HttpClient提交请求。 我不确定我在这里做的事情是否正确

我还有两个版本的SubmitClaims(),都可以使用。但我不知道哪个版本更好

版本1

    [HttpPost]
    public async Task<string> SubmitClaims()
    {
        string result = "";
        result = await RunAsync();
        return result;
    }
[HttpPost]
公共异步任务SubmitClaims()
{
字符串结果=”;
结果=等待RunAsync();
返回结果;
}
第二版学习

[HttpPost]
公共异步任务SubmitClaims()
{
返回等待任务。运行(()=>
{
返回RunAsync();
});
}
静态异步任务RunAsync()
{
string result=“失败。”;
使用(var client=new HttpClient())
{
尝试
{
client.BaseAddress=新Uri(“http://peter:8001/internal/uickpost");
client.DefaultRequestHeaders.Add(“contenttype”、“application/xml”);
client.DefaultRequestHeaders.Add(“hiconline.protocol.content.role”、“REQUEST”);
client.DefaultRequestHeaders.Add(“hiconline.protocol.content.transactionid”、“asdfsdf”);
client.DefaultRequestHeaders.Add(“hiconline.protocol.remote.contenttype”、“TestDataType”);
client.DefaultRequestHeaders.Add(“hiconline.protocol.remote.mode”,“P”);
client.DefaultRequestHeaders.Host=“peter:8001”;
client.DefaultRequestHeaders.Accept.Add(新MediaTypeWithQualityHeaderValue(“text/plain”);
字符串opv=“测试数据”;
HttpContent _内容=新的StringContent(opv);
_content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/xml”);
_Add(“contenttype”、“TestDataType”);
HttpResponseMessage response1=等待客户端.PostAsync(client.BaseAddress,_content);
if(响应1.IsSuccessStatusCode)
{
Uri gizmoUrl=response1.Headers.Location;
结果=response1.Content.ReadAsStringAsync().result;
}
}
捕获(例外情况除外)
{
结果=例如消息;
}
返回结果;
}
}

选项1更好
RunAsync()
已经返回了一个任务,那么为什么还要创建另一个任务呢


更好的方法是
return-await-RunAsync()。更好的方法是直接调用
RunAsync
,因为包装器不添加任何内容。

选项1更好
RunAsync()
已经返回了一个任务,那么为什么还要创建另一个任务呢


更好的方法是
return-await-RunAsync()。更好的方法是直接调用
RunAsync
,因为包装器没有添加任何内容。

Hi recursive,谢谢您的帮助。只需返回RunAsync();导致错误:由于这是一个异步方法,返回表达式的类型必须为“string”而不是“Task”递归,我将public async Task SubmitClaims()更改为public string SubmitClaims(){return RunAsync().Result;}编译没有问题,但停止调试后的结果是[object object]。为什么我必须在SubmitClaims()中使用异步任务,即使我已经在RunAsync()中使用过它?您必须在返回类型中使用
Task
,因为您在方法体中使用
wait
。如果您等待,您必须返回一个任务。您好,谢谢您的帮助。只需返回RunAsync();导致错误:由于这是一个异步方法,返回表达式的类型必须为“string”而不是“Task”递归,我将public async Task SubmitClaims()更改为public string SubmitClaims(){return RunAsync().Result;}编译没有问题,但停止调试后的结果是[object object]。为什么我必须在SubmitClaims()中使用异步任务,即使我已经在RunAsync()中使用过它?您必须在返回类型中使用
Task
,因为您在方法体中使用
wait
。如果等待,则必须返回任务。
    [HttpPost]
    public async Task<string> SubmitClaims()
    {
        return await Task.Run(() =>
        {
            return RunAsync();
        });
    }


    static async Task<string> RunAsync()
    {
        string result = "Failed.";
        using (var client = new HttpClient())
        {
            try
            {
                client.BaseAddress = new Uri("http://peter:8001/internal/uickpost");
                client.DefaultRequestHeaders.Add("contenttype", "application/xml");
                client.DefaultRequestHeaders.Add("hiconline.protocol.content.role", "REQUEST");
                client.DefaultRequestHeaders.Add("hiconline.protocol.content.transactionid", "asdfsdf");
                client.DefaultRequestHeaders.Add("hiconline.protocol.remote.contenttype", "TestDataType");
                client.DefaultRequestHeaders.Add("hiconline.protocol.remote.mode", "P");
                client.DefaultRequestHeaders.Host = "peter:8001";
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));

                string opv = "Test Data";

                HttpContent _content = new StringContent(opv);

                _content.Headers.ContentType = new MediaTypeHeaderValue("application/xml");
                _content.Headers.Add("contenttype", "TestDataType");

                HttpResponseMessage response1 = await client.PostAsync(client.BaseAddress, _content);


                if (response1.IsSuccessStatusCode)
                {
                    Uri gizmoUrl = response1.Headers.Location;
                    result = response1.Content.ReadAsStringAsync().Result;
                }
            }
            catch (Exception ex)
            {
        result = ex.Message;
            }
            return result;
        }
    }