如何从字符串方法中获取异步值



我使用API表单async方法和我的代码如下,

public async void Test(string token, int tenantId, string fromDate,string searchText)
{
try
{
string serviceUrl = "http://localhost/Testapi/api/details/requestDetails/Details";
string jsonParamterData = new JavaScriptSerializer().Serialize(new
{
FromDate = fromDate,
SearchText = searchText,
});
HttpClient client = new HttpClient();
HttpMethod method = new HttpMethod("POST");
HttpRequestMessage message = new HttpRequestMessage(method, serviceUrl);
StringContent content = new StringContent(jsonParamterData, Encoding.UTF8, "application/json");
client.DefaultRequestHeaders.Add("TenantId", tenantId.ToString());
client.DefaultRequestHeaders.Add("Authorization", string.Format("bearer {0}", token));
message.Content = content;
var response = await client.PostAsync(serviceUrl, content);
var result = await response.Content.ReadAsStringAsync();
client.Dispose();
}
}

我需要从另一种方法获得响应结果。

public string GetValue(){

}

但是Test()方法是无效的,那么我如何从另一个方法访问Test()结果值?是否可以在async方法中返回值。

更新:

[WebMethod(EnableSession = true)]
public string GetValue(){

}

GetValue()是一种网络方法

你应该做这样的事情:

public async Task<string> Test(string token, int tenantId, string fromDate,string searchText)
{
string serviceUrl = "http://localhost/Testapi/api/details/requestDetails/Details";
string jsonParamterData = new JavaScriptSerializer().Serialize(new
{
FromDate = fromDate,
SearchText = searchText,
});
HttpClient client = new HttpClient();
HttpMethod method = new HttpMethod("POST");
HttpRequestMessage message = new HttpRequestMessage(method, serviceUrl);
StringContent content = new StringContent(jsonParamterData, Encoding.UTF8, "application/json");
client.DefaultRequestHeaders.Add("TenantId", tenantId.ToString());
client.DefaultRequestHeaders.Add("Authorization", string.Format("bearer {0}", token));
message.Content = content;
var response = await client.PostAsync(serviceUrl, content);
var result = await response.Content.ReadAsStringAsync();
client.Dispose();
return result;
}

我强烈建议您避免使用asmx来执行异步函数,因为它已被弃用并停止使用。为了更清楚地说明,我应该说async/await模式在较低版本的net框架中有一些过头的地方。您至少可以使用基于dotnet核心或最新版本的Wcf服务。NetFramework类似于4.6+。另一种选择是使用Rest-Apis和基于Aspnet或AspnetCore的异步/等待承诺。但是,如果您选择继续当前的解决方案,您可以在此处查看asmx WebMethods的异步执行:https://learn.microsoft.com/en-us/previous-versions/dotnet/articles/aa480516(v=msdn.10(?重定向自=MSDN

如果你想同时使用AsyncCallBack和async/await模式,你可以这样做:

public IAsyncResult BeginGetvalue(AsyncCallback cb, Object state)
{
Action action = async () => {
string result = await GetValue();
};
return action.BeginInvoke(cb, state);
}

我应该再次指出:请不要这样做与你自己。ASMX是不推荐使用的解决方案:(使用这些技术来处理您的解决方案:

  • 基于netcore+kestrel的异步Restful api
  • 基于aspnet-mvc+自托管owin的异步Restful api
  • 基于http2+和.net5的Grpc解决方案
  • netcore-on-netframework中的Wcf服务。以上所有技术都支持异步方法

最新更新