MVC异步方法

时间:2014-12-17 05:38:04

标签: asp.net-mvc-4 asynchronous async-await httpclient

我正在开发一个通过第三方提交请求的MVC项目。

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

此外,我有两个版本的SubmitClaims(),两者都有效。但我不知道哪个版本更好。

版本1

    [HttpPost]
    public async Task<string> SubmitClaims()
    {
        string result = "";
        result = await RunAsync();
        return result;
    }

版本2向Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task<string>'

学习
    [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;
        }
    }

1 个答案:

答案 0 :(得分:4)

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

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