1

コードをデバッグしているときに、UrlRoutingModule クラスのコードが何度かクラッシュしました。エラーには次の 2 種類があります。

  • null 参照の例外:

foreach (var route in l) { RouteTable.Routes.Add(route); <-- It crashed here because route is NULL }

上記のステートメントの前に「if (route != null)」を追加したところ、問題が解決したようです。

  • ArgumentException: 指定されたルートはルート コレクションに既に存在します。コレクションに重複するルートを含めることはできません。

2 番目の例外も、上記と同じ行で発生しました。

このエラーが発生するとすぐに、サイト全体が停止したため、IIS Express と Visual Studio を閉じなければならなかったため、この問題を解決するにはどうすればよいでしょうか。

4

1 に答える 1

0

これは UrlRoutingModule クラスのバグです。本日公開した最新のビルドで修正されています。このクラスの正しい実装は次のとおりです。

/// <summary>
/// Forbids MVC routing of WebDAV requests that should be processed by WebDAV handler.
/// </summary>
/// <remarks>
/// This module is needed for ASP.NET MVC application to forbid routing
/// of WebDAV requests that should be processed by <see cref="DavHandler"/>.
/// It reads DavLocations section and inserts ignore rules for urls that correspond
/// to these locations.
/// </remarks>
public class UrlRoutingModule : IHttpModule
{
    /// <summary>
    /// Represents route to be ignored. 
    /// </summary>
    /// <remarks>
    /// Required to insert ignore route at the beginning of routing table. We can not 
    /// use the <see cref="RouteCollection.IgnoreRoute"/> as it adds to the and of the 
    /// routing table.
    /// </remarks>
    private sealed class IgnoreRoute : Route
    {
        /// <summary>
        /// Creates ignore route.
        /// </summary>
        /// <param name="url">Route to be ignored.</param>
        public IgnoreRoute(string url)
            : base(url, new StopRoutingHandler())
        {
        }
        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary routeValues)
        {
            return null;
        }
    }

    /// <summary>
    /// Indicates that the web application is started.
    /// </summary>
    private static bool appStarted = false;

    /// <summary>
    /// Application start lock.
    /// </summary>
    private static object appStartLock = new Object();

    void IHttpModule.Init(HttpApplication application)
    {
        // Here we update ASP.NET MVC routing table to avoid processing of WebDAV requests.
        // This should be done only one time during web application start event.

        lock (appStartLock)
        {
            if (appStarted)
            {
                return;
            }
            appStarted = true;
        }

        DavLocationsSection davLocationsSection = DavLocationsSection.Instance;

        int routeInsertPosition = 0;
        foreach (DavLocation location in davLocationsSection.Locations)
        {
            string[] methods = location.Verbs.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                .Select(verb => verb.Trim().ToUpper()).ToArray();

            string prefix = location.Path.Trim(new[] { '/', '\\' });
            string path = (prefix == string.Empty ? string.Empty : prefix + "/") + "{*rest}";

            IgnoreRoute ignoreRoute = new IgnoreRoute(path);
            if (methods.Length > 0)
            {
                ignoreRoute.Constraints = new RouteValueDictionary { { "httpMethod", new HttpMethodConstraint(methods) } };
            }
            RouteTable.Routes.Insert(routeInsertPosition++, ignoreRoute);
        }
    }

    public void Dispose()
    {
    }
}
于 2014-06-18T01:57:07.763 に答える