WebApi2.0 DelegatingHandler - 错误 - 索引超出数组范围

WebApi2.0 DelegatingHandler - error - index was out of bounds of the array

我有一个 webapi 2.0 项目。我正在 webapiconfig.cs 中注册两个委托处理程序。有时它会抛出错误 "Index was out of bounds of the array" 并且统计跟踪显示 - 在 handler2 的 handler1 的 System.Collections.GenericList.Add(T item) 处出错。我还使用我在 Global.asax 中的 Application_Start 注册的 unityconfig,我在 Global.asax 中的 Application_Start 注册 WebApiconfig 我不知道为什么这种奇怪的行为在大多数时间都运行良好,但有时会抛出此错误。

我在WebApiconfig.cs中的代码如下-

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        config.EnableCors();

        config.MessageHandlers.Add(new Handler1(););

        config.MessageHandlers.Add(new Handler2());

        // Web API routes
        config.MapHttpAttributeRoutes();

    }

两个处理程序的代码如下 -

public class Handler1 : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {


        string routeTemplate = ((IHttpRouteData[])request.GetConfiguration().Routes.GetRouteData(request).Values["MS_SubRoutes"])
                                .First().Route.RouteTemplate.ToString();



        IPrincipal principal = new GenericPrincipal(new GenericIdentity(new Guid()), new string[] { "myRole" });
        HttpContext.Current.User = principal;

        return base.SendAsync(request, cancellationToken).ContinueWith(
        (task) =>
        {
            HttpResponseMessage response = task.Result;

            return response;
        }
    );
    }
    }
public class Handler2 : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        string routeTemplate = ((IHttpRouteData[])request.GetConfiguration().Routes.GetRouteData(request).Values["MS_SubRoutes"])
                                .First().Route.RouteTemplate.ToString();

        HttpConfiguration config = request.GetConfiguration();
        config.Filters.Add(new Filter1());


        return base.SendAsync(request, cancellationToken).ContinueWith(
        (task) =>
        {
            HttpResponseMessage response = task.Result;

            return response;
        }
    );
    }
}

有人可以帮助我做些什么吗?

这条线看起来很可疑

string routeTemplate = ((IHttpRouteData[])request.GetConfiguration()
                               .Routes.GetRouteData(request)
                               .Values["MS_SubRoutes"])
                               .First()
                               .Route.RouteTemplate.ToString();

因为"MS_SubRoutes" 东西不可能存在,所以你需要破解不同的代码块来验证。另外你需要确保集合至少有一个成员,所以你也需要控制这个问题。

var ms_SubRoutes = (IHttpRouteData[])request
    .GetConfiguration()
    .Routes
    .GetRouteData(request)
    .Values["MS_SubRoutes"];

string routeTemplate;

//Verify if "MS_SubRoutes" are part of the request
if (ms_SubRoutes != null)
{
    try
    {
        routeTemplate = ms_SubRoutes.First()
                                    .Route
                                    .RouteTemplate.ToString();
    }
    catch(IndexOutOfRangeException ior)
    {
        //Do something
        throw;
    }
    catch (Exception ex)
    {
        //Do something
        throw;
    }
}

问题是在处理程序中添加过滤器。 config.Filters.Add(新过滤器1());

在 GlobalConfig 中添加了过滤器,一切都运行顺利。