如何在Owin Middleware

时间:2018-04-25 20:29:11

标签: c# httprequest owin

上下文

我有一个Owin应用程序,它接受对URL路径myapp / api / mgmt发出的HTTP请求。我正在实现一个继承自OwinMiddleware并重写Invoke方法的中间件类(而不是使用控制器或其他处理请求的机制)。

我想处理一些GET和POST请求,例如:

  • myapp / api / mgmt / queue / id (GET请求检索有关ID = id 的队列的信息。)

  • myapp / api / mgmt / queue / id ?action = dequeue(POST请求将队列中的项目从ID = id 中排队。)

  • myapp / api / mgmt / queue / id ?action = enqueue(POST请求将项目排入队列,ID = id 。)

  • myapp / api / mgmt / queue / id / itemid / status(获取ID = itemid的项目状态的GET请求内部队列ID = id 。)

问题

我想知道如何从包含URL中的请求中提取 id itemid ,以及确保它们是GUID。我知道如何获取查询字符串参数:context.Request.Query["action"],但我不知道如何获取路径中的值(即每个字符串用斜杠分隔)。我将在下面介绍我是如何做到的,但我想知道是否有任何Owin类提供更加惯用/安全/有效的方式来处理这些请求。

我的尝试

我尝试捕获各种请求的方式如下:

string path = context.Request.Path.Value; //path should start with "/queue/id"
if (path.StartsWith("/queue")
{
   string[] pathValues = path.Split('/');
   // first value in pathValues should be ''
   if (pathValues.Length > 2 && pathValues[1] == "queue")
   {
       if (Guid.TryParse(pathValues[2], out Guid queueId))
       {
           if (pathValues.Length == 3) 
           {
               // Now we know it's either (1) a GET for queue info, (2) a POST to dequeue an item from the queue, or (3) a POST to enqueue an item to the queue
           }
           else if (pathValues.Length == 5)
           {
               if (Guid.TryParse(pathValues[3], out Guid itemId) && pathValues[4] == "status")
               {
                   // we know it's a GET request for the item's status
               }
           }
           // All other cases return a 400.
       }
   }
}

重申一下,我想知道是否有更好/更标准的方法来解决这个问题。

0 个答案:

没有答案