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 中添加了过滤器,一切都运行顺利。
我有一个 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 中添加了过滤器,一切都运行顺利。