微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从控制器返回通用响应?

如何解决如何从控制器返回通用响应?

Net core 应用程序和调用其他 .Net Core Web API 应用程序。我正在调用控制器方法如下

public async Task<T> SendRequest<T,U>(U request,string methodName,HttpMethod reqtype,string token)
        {
            T res = default(T);
            try
            {
                string url = methodName;
                string contentJson = JsonConvert.SerializeObject(request);
                var content = new StringContent(contentJson,Encoding.UTF8,"application/json");
                var actualRequest = new HttpRequestMessage(reqtype,url);
                actualRequest.Content = content;
                _httpClient.DefaultRequestHeaders.Clear();
                _httpClient.DefaultRequestHeaders.Add("Authorization",token);
                var rawData = await _httpClient.SendAsync(actualRequest);
                var processedData = await rawData.Content.ReadAsstringAsync().ConfigureAwait(false);
                res = JsonConvert.DeserializeObject<T>(processedData);
            }
            catch (Exception ex)
            {
                _reqHandler.RaiseBusinessException(MethodBase.GetCurrentMethod()?.DeclaringType?.DeclaringType?.Name,MethodBase.GetCurrentMethod().Name,"InputType: " + typeof(U) + " || OutputType: " + typeof(T) + " || Error Message: " + ex.Message);
            }
            return res;
        }  

以下是从 API 控制器返回的示例

return StatusCode(404,result.MapFileFileUploadSummary);
 return StatusCode((int)System.Net.HttpStatusCode.Unauthorized);

在上面的代码中,当我返回一些状态代码时,我想将其绑定到泛型类型 T。例如,我正在调用一个方法

 _Client.SendRequest<ObjectResult,requestModel>()

我正在发送类型为 ObjectResult 的 ObjectResult 作为返回类型。例如,我在processedData 中得到以下响应,

"{\"type\":\"https://tools.ietf.org/html/rfc7235#section-3.1\",\"title\":\"Unauthorized\",\"status\":401,\"traceId\":\"00-e517f28f9c0b0441a8634c1c703a1cae-f64589d11056ad45-00\"}"

但是无法绑定

res = JsonConvert.DeserializeObject<T>(processedData); 这不会返回任何我在此处添加屏幕截图

enter image description here

这里 T 是 ObjectResult 类型。我在这里寻找通用响应类型,以便我始终可以将其绑定到类型 T。有人可以帮助我完成此实现。任何帮助,将不胜感激。谢谢

解决方法

您遇到的问题是:如果出现错误,JSON 将与成功时完全不同。

为了举例,我将隐藏大部分关于 HTTP 请求的内容:

'01-'

对我来说,你不应该返回“T”而是“ActionResult”。您的代码仍然不知道实际内容 (T) 是什么,但知道它将返回 ActionResult。它会减轻其余的。

public async Task<ActionResult<T>> SendRequest<T,U>(U request,string methodName,HttpMethod reqtype,string token);

在所有情况下,您都会有一个可以直接从控制器返回的 ActionResult。

如果出错,结果只会是其他服务器返回的状态码。

如果成功,您将获得其他服务器发送的数据。

我认为如果出现错误,将状态代码返回给您的用户就足够了,但是如果要发送整个对象,您也可以这样做。您只需要先创建一个类来表示发生错误时发送的数据,然后:

var response = await _httpClient.SendAsync(actualRequest);
if (!response.IsSuccessStatusCode) 
{
   return new StatusCodeResult((int)response.StatusCode)
}
var responseData = JsonConvert.DeserializeObject<T>(await rawData.Content.ReadAsStringAsync());
return new ObjectResult(responseData);

并且您还必须将方法签名更改为:

var response = await _httpClient.SendAsync(actualRequest);

object responseData;

if (response.IsSuccessStatusCode) 
{
    responseData = JsonConvert.DeserializeObject<T>(await rawData.Content.ReadAsStringAsync());
}
else 
{
   responseData = JsonConvert.DeserializeObject<YourClassInCaseOfError>(await rawData.Content.ReadAsStringAsync());
}

return new ObjectResult(responseData) 
{
   StatusCode = (int)response.StatusCode,}

由于第二个示例可能会返回 2 种不同的类型(数据类型或错误类型),因此您必须使用 ActionResult,而不是 ActionResult

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。