【问题标题】:Assign Value In Base Controller From Post Request In ASP.Net core web API从 ASP.Net 核心 Web API 中的发布请求在基本控制器中分配值
【发布时间】:2019-09-17 18:26:27
【问题描述】:

我有很多控制器依赖于一个变量,比如说 projectId。

因此,对于所有方法的每个请求,我都必须按如下方式解析 projectId。那么是否可以在基本控制器变量中获取此值并将其直接用于所有方法。我找到了一些动作执行和初始化方式,但它们是 .net 中的示例,我无法进入 asp.net 核心 Web API。

public void Save([FromBody]JObject data)
        {
            new SaveMethod((int)data["projectId"])
                .Save((string)data["otherData"]);
        }

【问题讨论】:

  • 有什么理由不使用模型绑定来获取强类型输入参数?
  • 我必须为每种方法创建很多模型。 :(

标签: c# asp.net-core asp.net-core-webapi


【解决方案1】:

您可以简单地使用默认模型绑定,创建一个类,应用程序在收到 post 请求后会自动绑定到对象:

[HttpPost]
public void Post([FromBody] MyValue value)
{
}

public class MyValue {
    public int projectID { get; set; }

    //Other property 
} 

请求将类似于:

POST https://localhost:XXXX/api/values
Content-Type: application/json

{"projectID": 1}

如果您希望跨请求的数据可用,您可以save to session 供以后访问。

或者你可以不使用模型绑定(删除[FromBody]参数,模型绑定在过滤器之前执行),并在OnActionExecuting中获取请求正文并保存到会话以供以后访问:

public class MyControllerBase: Controller
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        base.OnActionExecuting(context);


        var bodyStr = "";
        var req = context.HttpContext.Request;

        // Allows using several time the stream in ASP.Net Core
        req.EnableRewind();

        // Arguments: Stream, Encoding, detect encoding, buffer size 
        // AND, the most important: keep stream opened
        using (StreamReader reader
                = new StreamReader(req.Body, Encoding.UTF8, true, 1024, true))
        {
            bodyStr = reader.ReadToEnd();
        }

        // Rewind, so the core is not lost when it looks the body for the request
        req.Body.Position = 0;

    }

}

您可以让您的控制器继承 MyControllerBase 并对其进行修改以满足您的要求。

【讨论】:

  • 我正在使用 .net core web api。在这个 onactionexecuting 中不起作用。它给出的错误是“找不到合适的方法来覆盖”。
  • 使用模型绑定,我将不得不创建很多模型。每个方法。
  • 好的,知道了。我继承了控制器库而不是控制器。这就是 onactionexecuting 不起作用的原因。
猜你喜欢
  • 2021-12-08
  • 2023-03-28
  • 2018-03-30
  • 2017-01-05
  • 2019-12-04
  • 2017-12-31
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多