如何 return 来自 Controller 的通用响应?

How to return Generic response from Controller?

Net 核心应用程序并调用其他 .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;
        }  

以下是 return 来自 API 控制器

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

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

 _Client.SendRequest<ObjectResult, requestModel>()

我正在发送 return 类型的 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); return没什么 我在这里添加截图

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

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

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

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

对我来说,你不应该 return “T”,而是“ActionResult”。您的代码仍然不知道实际内容 (T) 是什么,但知道它将 return 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);

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

如果出现错误,结果只会是其他服务器 return 编辑的状态代码。

如果成功,您将收到另一台服务器发送的数据。

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

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,  
}

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

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

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