繁体   English   中英

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

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

我有一个webapi 2.0项目。 我在webapiconfig.cs中注册了两个委托处理程序。 有时会引发错误“索引超出数组范围”,并且轨迹跟踪显示-在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(new Filter1());

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM