Asp.net mvc 4 MVC正交法
我正在从事一个MVC项目,该项目通过第三方提交请求 在我的控制器中,我有一个SubmitClaims()操作,它接收ajax请求,然后调用RunAsync()。RunAsync使用HttpClient提交请求。 我不确定我在这里做的事情是否正确 我还有两个版本的SubmitClaims(),都可以使用。但我不知道哪个版本更好 版本1Asp.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
[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;
}
}