Asp.net 可以使用URI模板将URI与路由匹配吗?

Asp.net 可以使用URI模板将URI与路由匹配吗?,asp.net,asp.net-mvc,routing,uritemplate,Asp.net,Asp.net Mvc,Routing,Uritemplate,ASP.NET或Nancy等框架提供了可用于指定路由的语法,例如: MapRoute("/customers/{id}/invoices/{invoiceId}", ...) 在ASP.NET中,路由在两个方向上工作。它们可以将请求URI(如/customers/32/invoices/19)匹配到路由,并且可以将{id:37,invoiceId:19}等参数解析为URI 还为URI定义了一个类似的规范(尽管更丰富),该规范通常用于解析URI。例如: UriTemplate("/custome

ASP.NET或Nancy等框架提供了可用于指定路由的语法,例如:

MapRoute("/customers/{id}/invoices/{invoiceId}", ...)
在ASP.NET中,路由在两个方向上工作。它们可以将请求URI(如
/customers/32/invoices/19
)匹配到路由,并且可以
{id:37,invoiceId:19}
等参数解析为URI

还为URI定义了一个类似的规范(尽管更丰富),该规范通常用于解析URI。例如:

UriTemplate("/customers/{id}/invoices{/invoiceId}{?sort}", { id: 37, invoiceId: 19, sort: 'asc' } )
// returns:  /customers/37/invoices/19?sort=asc

我的问题是,RFC6570中指定的语法能否用于请求URI匹配到路由?语法中是否有一部分会使将给定URI与给定URI模板匹配变得不明确?是否有支持将URI与URI模板匹配的库

我想这会很困难。当然,前缀语法之类的东西会导致无法重新生成原始参数

对于路径段扩展之类的事情

 {/list*}           /red/green/blue
您如何知道路径的哪些部分是文字,哪些部分是参数的一部分?URITemplate规范中有很多相当奇怪的行为,我怀疑即使可以匹配,也会相当昂贵


您是否有兴趣为了路由目的而这样做

关于匹配很简单,但是关于解决您需要用RFC 6570替换ASP.net部分

不幸的是,我正在使用expressjs在节点中执行此操作,这可能没有帮助,但我确信类似(用于解析)的内容在ASP中也可用

下面是一些.js代码来说明重写 使用RFC6570与express js一起使用(在模式中使用的优点是,您还可以为uri模板定义正则表达式):


你想干什么?你在使用哪种技术?为什么要使用RFC6570?你尝试了什么,失败了什么?你看到我下面的答案了吗?查看函数
ldoToRouter
。JSON模式链接描述对象(LDO)是您的UriTemplate加上方法,例如{“href”:“/customers/{id}/invoices{invoicesid}{?sort}”,“方法”:“get”}。。。
  var deref = require('json-schema-deref');
  var tv4 = require('tv4');
  var url = require('url');
  var rql = require('rql/parser');
  var hyperschema = {
  "$schema": "http://json-schema.org/draft-04/hyper-schema",
  "links": [
    {
      "href": "{/id}{/ooo*}{#q}",
      "method": "GET",
      "rel": "self",
      "schema": {
        "type": "object",
        "properties": {
          "params": {
            "type": "object",
            "properties": {
              "id": {"$ref": "#/definitions/id"}
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": true
      }
    }
  ],
  "definitions": {
    "id": {
      "type": "string",
      "pattern": "[a-z]{0,3}"
    }
  }
}
// DOJO lang AND _
function getDottedProperty(object, parts, create) {
    var key;
    var i = 0;

    while (object && (key = parts[i++])) {
        if (typeof object !== 'object') {
            return undefined;
        }
        object = key in object ? object[key] : (create ? object[key] = {} : undefined);
    }

    return object;
}
function getProperty(object, propertyName, create) {
    return getDottedProperty(object, propertyName.split('.'), create);
}
function _rEscape(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}

function getPattern(k, ldo, customCat) {
  // ...* = explode = array
  // ...: = maxLength
  var key = ((k.slice(-1) === '*') ? k.slice(0,-1) : k).split(':')[0];
  var cat = (customCat) ? customCat : 'params'; // becomes default of customCat in TS
  var pattern = '';
  if (typeof ldo === 'object' && ldo.hasOwnProperty('schema')) {
    var res = getProperty(ldo.schema, ['properties',cat,'properties',key,'pattern'].join('.'));
    if (res) {
      console.log(['properties',cat,'properties',key,'pattern'].join('.'),res);
      return ['(',res,')'].join('');
    }
  }
  return pattern;
}
function ldoToRouter(ldo) {
  var expression = ldo.href.replace(/(\{\+)/g, '{') // encoding
    .replace(/(\{\?.*\})/g, '') // query
    .replace(/\{[#]([^}]*)\}/g, function(_, arg) {
      // crosshatch
      //console.log(arg);
      return ['(?:[/]*)?#:',arg,getPattern(arg,ldo,'anchor')].join('');
    })
    .replace(/\{([./])?([^}]*)\}/g, function(_, op, arg) {
      // path seperator
      //console.log(op, '::', arg, '::', ldo.schema);
      return [op,':',arg,getPattern(arg,ldo)].join('');
    });
    return {method: ldo.method.toLowerCase(), args:[expression]};
}

deref(hyperschema, function(err, fullSchema) {
  console.log('deref hyperschema:',JSON.stringify(fullSchema));
  var router = fullSchema.links.map(ldoToRouter);

  console.log('router:',JSON.stringify(router));
});