【问题标题】:API Response to MVC Action Output (MVC 6)API 对 MVC 操作输出的响应 (MVC 6)
【发布时间】:2016-02-18 17:38:21
【问题描述】:

我有一个 API 定义接口(合同)

public interface IGuidelineApi : IBaseApi
{
    ApiResult Operation(int i, string s, long l);
}

Server Side API 实现原型是这样的:

[Route("api/[controller]")]
public class GuidelineController : IGuidelineApi
{
    [HttpGet]
    public ApiResult Operation([FromQuery]int i, [FromQuery]string s, [FromQuery]long l)
    {
        // ApiResult inherits ActionResult
        return new ApiResult(new { intVal = i, strVal = s, longVal = l });
    }
}

从使用 DispatchProxy 的任何客户端(MVC 客户端应用程序或移动设备)执行任何 API 方法可以通过(API 接口)依赖注入调用它们

private readonly IGuidelineApi _guidelineApi;
public AccountController(IGuidelineApi guidelineApi)
{
    _guidelineApi = guidelineApi;

     // DispatchProxy magic here!
    _guidelineApi.Operation(1, "hello", 617);
}

所以问题是,我是否可以直接将 API 响应传输到 MVC 客户端输出 (IActionResult) 而无需序列化。 尝试替换 - 覆盖实际响应(客户端的 StreamContent)

【问题讨论】:

  • 我不太明白你在问什么;但是你为什么要让你的 API 返回一些 ApiResult 类型?您可以只返回实际的 (JSON-) 可序列化对象,从而使您的 API 更简单、更兼容,而无需 MVC 样板。
  • 嗨,需要一个结果包装器来为终端客户端(Web 客户端或移动应用程序)提供通用类型作为类型安全(我有接口 - API 合同)
  • 但是ApiResult不需要继承自ActionResult

标签: model-view-controller asp.net-web-api asp.net-core


【解决方案1】:

如果你知道结果类型,这项工作:

API调用结果执行演示:

// Direct stream transport
if (response.Content is StreamContent)
{
    actionContext.HttpContext.Response.ContentType = "application/json; charset=utf-8";
    actionContext.HttpContext.Response.Headers.Add("Metadata : Type.Sample.DataSourceResult");
    await ((StreamContent)response.Content).CopyToAsync(actionContext.HttpContext.Response.Body)

    // Global Action Filter must know actual result
    return null
}

MVC 注册的全局动作过滤器:

public override void OnActionExecuted(ActionExecutedContext context)
{
    // Header check with extension method for type info
    if (context.HttpContext.Response.IsDataSourceResult())
    {
        // prevent end of null or empty string character!
        context.Result = new NoContentResult(); 
    }
}

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2015-04-28
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多