【问题标题】:WebGet UriTemplate fails on dot ('.'/%2E)?WebGet UriTemplate 在点 ('.'/%2E) 上失败?
【发布时间】:2012-01-05 07:58:26
【问题描述】:

我一直在尝试弄清楚为什么这个 UriTemplate 不能作为 WCF 服务的一部分工作并且似乎无法到达任何地方:

[WebGet(UriTemplate="api/1.0/version")]
string GetVersion();

快速测试表明 UrlTemplateTable 匹配良好(输出为 'api/1.0/version'):

static void Main(string[] args)
{
    Uri prefix = new Uri("http://localhost/");
    System.UriTemplateTable table = new System.UriTemplateTable(prefix);
    table.KeyValuePairs.Add(new KeyValuePair<UriTemplate, Object>(new UriTemplate("api/1.0/version"), "a"));
    table.KeyValuePairs.Add(new KeyValuePair<UriTemplate, Object>(new UriTemplate("api/2.0/version"), "b"));
    table.KeyValuePairs.Add(new KeyValuePair<UriTemplate, Object>(new UriTemplate("api/version"), "c"));

    Uri uri = new Uri("http://localhost/api/1.0/version");
    UriTemplateMatch match = table.MatchSingle(uri);
    Console.WriteLine("{0}", match.Template.ToString());
}

点不是 URL 中的非法字符,RequestPathInvalidCharacters 不排除它,没有可能干扰的重写规则。在它的文档中也找不到任何东西。

虽然有一个明显的解决方法,但不要使用模板中的点,但我很好奇为什么它会失败并显示“HTTP 404/找不到资源”。

【问题讨论】:

    标签: wcf rest


    【解决方案1】:

    我之前遇到过同样的问题。我意识到这是 IIS 中的限制,与 WCF 无关。当 IIS 最初拦截请求时,假定 .表示一个扩展,因此它会尝试为该扩展找到一个托管处理程序。因为它没有找到任何东西,所以它只是抛出一个 404。

    问候 巴勃罗。

    【讨论】:

    • 很好,我在错误的地方寻找答案!搜索 IIS,出现一堆信息,more pointed SO question here
    • 非常好。比你得到的分数高出许多倍!我试图使 Web 服务 URL 看起来像一个文件,因此以 .something 结尾!
    • 还有其他无效的字符吗?
    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多