【问题标题】:MVC aynchronous methodMVC 异步方法
【发布时间】:2014-12-17 05:38:03
【问题描述】:

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

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

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

版本 1

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

第二版向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;
        }
    }

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 你好递归,谢谢你的帮助。只需返回 RunAsync();导致错误:由于这是一个异步方法,因此返回表达式必须是 'string' 类型,而不是 'Task'
    • 嗨,递归,我将 public async Task SubmitClaims() 更改为 public string SubmitClaims() {return RunAsync().Result;} 编译没有问题,但结果是 [object object]停止调试后。为什么我必须在 SubmitClaims() 中使用 async Task,即使我已经在 RunAsync() 中使用过它?
    • 你必须在返回类型中使用Task&lt;&gt;,因为你在方法体中使用了await。如果等待,则必须返回一个任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2016-12-17
    • 2014-12-02
    • 2015-07-05
    相关资源
    最近更新 更多