【问题标题】:Wcf Web Api service routes conflicting with regular asp.net mvc routes (web api preview 4)Wcf Web Api 服务路由与常规 asp.net mvc 路由冲突(web api 预览 4)
【发布时间】:2011-11-05 18:07:12
【问题描述】:

我注意到我的 mvc 应用在使用时创建了错误的 url:

@using (Html.BeginForm("Test", "Test"))
{
    <input type="submit" value="Submit" />
}

这是生成的html源代码:

<form action="/books?action=Test&amp;controller=Test" method="post">

请注意,action 以 /books 开头。这是错误的!

我注意到 Html.BeginForm 始终包含已向 MapServiceRoute 注册的第一个 Web api 的开头。 (见下面的代码)

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    var builder = HttpHostConfiguration.Create();
    routes.MapServiceRoute<BooksService>("books", builder);

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}

我花了很长时间试图弄清楚为什么我的应用程序中的 url 被破坏了,但没有得到任何结果。 然后我决定用一个极其简单的 mvc 应用程序进行测试,果然问题可以很容易地重现。 我测试过的 mvc 应用程序非常简单,它是由一个 asp mvp 创建的。你可以找到它here。我所做的只是添加 TestController 和 Views/Test/Index.cshtml 视图。在视图中,我添加了上面显示的 Html.BeginForm。如果您启动应用程序并访问测试控制器,只需将鼠标悬停在提交按钮上(或查看 html 源代码)即可看到 url 错误。

有人知道如何避免这个问题吗?

编辑: 这适用于 web api preview 4(2011 年 4 月)。

【问题讨论】:

    标签: asp.net-mvc-3 wcf-web-api


    【解决方案1】:

    另一种方式是定义路由约束:

    public class WcfRoutesConstraint : IRouteConstraint {
        public WcfRoutesConstraint(params string[] values) {
            this._values = values;
        }
    
        private string[] _values;
    
        public bool Match(HttpContextBase httpContext, Route route, string parameterName,
    RouteValueDictionary values, RouteDirection routeDirection) {
    
        // Get the value called "parameterName" from the
        // RouteValueDictionary called "value"
        string value = values[parameterName].ToString();
    
        // Return true is the list of allowed values contains
        // this value.
        bool match = !_values.Contains(value);
        return match;
        }
    }
    

    将约束分配给 MVC 路由

    routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
            new { controller = new WcfRoutesConstraint(new string[] {"contact","login"}) }
        );
    

    这可以防止 MVC 接触 URL“/login”和“/contact”

    【讨论】:

    • Alex,我不清楚 Web Api 的 RTM 版本发布后您是否会继续这样做?如果是这样,为什么?据我了解,这是一个错误,一旦 RTM 出来,我在下面描述的解决方法就不再必要了。
    • 如果它在新位中得到修复(今天可在 wcf.codeplex.com 获得)我将不再使用该约束。
    • preview 4 仍有缺陷。无论接下来发生什么,都应该有解决办法。
    • 我们会看看昨天的最新位是否已修复;-)
    【解决方案2】:

    找到了答案。这是一个已知问题。 Glenn Block 发布了一个解决方法。 我刚刚测试过,这确实解决了这个问题。 它将在下一次下降时修复。

    http://codebetter.com/glennblock/2011/08/05/integrating-mvc-routes-and-web-api-routes-2/

    【讨论】:

    • 这实际上是在处理问题而不是避免它! +1
    【解决方案3】:

    在我们的原型分支的下一个 drop 中,我们有 included 一个解决此问题的 WebApiRoute(使用我在博客文章中提到的方法)。 MapServiceRoute 使用它。

    【讨论】:

    • Glenn,你能粗略估计一下 RTM for Web Api 吗?我无法找到有关此的任何信息。谢谢!
    • 我现在不能。我可以告诉你的是,它正在出货,是一个成熟的产品。它将像 MVC 一样作为附加组件从框架中带外发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2015-11-14
    • 2012-09-28
    • 1970-01-01
    相关资源
    最近更新 更多