对 302 状态代码使用 handleexeption 注释时如何指定位置
How do you specify the location when using handleexeption annotation for a 302 status code
使用 c# Web Api 2,我有抛出 InvalidOperationException
的代码。返回状态代码 302 时,如何使用 HandleException
注释为重定向提供位置?
[HandleException(typeof(InvalidOperationException), HttpStatusCode.Found, ResponseContent = "Custom message 12")]
public IHttpActionResult GetHandleException(int num)
{
switch (num)
{
case 12: throw new InvalidOperationException("DONT SHOW invalid operation exception");
default: throw new Exception("base exception");
}
}
编辑:
对不起,我问这个问题有点仓促。上面的class使用了一个继承自ExceptionFilterAttribute的HandleExceptionAttributeclass。我在尝试调试他们的单元测试时没有意识到这一点。该问题不会出现在单元测试中,但会使用需要重定向 url 的 Visual Studio.webtest 出现。从 ExceptionFilterAttribute 继承的 class 没有提供允许提供重定向的 URL 的参数。很抱歉问题不完整,感谢您花时间回答。
/// <summary>
/// This attribute will handle exceptions thrown by an action method in a consistent way
/// by mapping an exception type to the desired HTTP status code in the response.
/// It may be applied multiple times to the same method.
/// </summary>
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
public sealed class HandleExceptionAttribute : ExceptionFilterAttribute
{
已编辑:感谢您更新问题。虽然我仍然不确定为什么要在此 WebApi 方法中重定向。希望这个答案能有所帮助。
我会处理 HandleExceptionAttribute 中的所有异常逻辑。您甚至可以使用您正在寻找的 302 代码从那里重定向。您的 HandleExceptionAttribute 看起来像这样(我包含了 3 种不同的基于异常返回结果的方法):
public sealed class HandleExceptionAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
//TODO: we can handle all types of exceptions here. Out of memory, divide by zero, etc etc.
if (context.Exception is InvalidOperationException)
{
var httpResponseMessage = context.Request.CreateResponse(HttpStatusCode.Redirect);
httpResponseMessage.Headers.Location = new Uri("http://www.YourRedirectUrl");
throw new HttpResponseException(httpResponseMessage);
}
if (context.Exception is UnauthorizedAccessException)
{
context.Response = context.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, context.Exception.Message);
return;
}
if (context.Exception is TimeoutException)
{
throw new HttpResponseException(context.Request.CreateResponse(HttpStatusCode.RequestTimeout, context.Exception.Message));
}
context.Response = context.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Unable to process your request.");
}
}
但是,如果您真的希望它按您要求的方式完成,您可以向 GetHandleException 方法添加第二个参数。这将接收消息字符串(或 URL),然后在 HandleExceptionAttribute 中将重定向 url 添加到参数(ActionArguements):
public IHttpActionResult GetHandleException(int num, string message = "")
{
switch (num)
{
case 12: return Redirect(message); //message string would be your url
default: throw new Exception("base exception");
}
}
然后你的 HandleExceptionAttribute 看起来像这样:
public sealed class HandleExceptionAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
context.ActionContext.ActionArguments["message"] = "your redirect URL";
}
}
根据以下内容即兴创作
public class HandleExceptionAttribute : ExceptionFilterAttribute
{
public Type ExceptionType { get; set; }
public HandleExceptionAttribute(Type exceptionType)
{
ExceptionType = exceptionType;
}
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Exception.GetType()==ExceptionType)
{
var response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.Moved);
response.Headers.Location=new Uri("http://google.co.uk");
response.Content=new StringContent("Message");
actionExecutedContext.Response = response;
}
base.OnException(actionExecutedContext);
}
}
用法
[HandleException(typeof(ExceptionOfTypeA))]
public HttpResponseMessage Get(int id)
{
throw new ExceptionOfTypeA();
}
尽管我看不出在重定向到可视页面时在其中包含内容有什么意义。但我们开始了
使用 c# Web Api 2,我有抛出 InvalidOperationException
的代码。返回状态代码 302 时,如何使用 HandleException
注释为重定向提供位置?
[HandleException(typeof(InvalidOperationException), HttpStatusCode.Found, ResponseContent = "Custom message 12")]
public IHttpActionResult GetHandleException(int num)
{
switch (num)
{
case 12: throw new InvalidOperationException("DONT SHOW invalid operation exception");
default: throw new Exception("base exception");
}
}
编辑: 对不起,我问这个问题有点仓促。上面的class使用了一个继承自ExceptionFilterAttribute的HandleExceptionAttributeclass。我在尝试调试他们的单元测试时没有意识到这一点。该问题不会出现在单元测试中,但会使用需要重定向 url 的 Visual Studio.webtest 出现。从 ExceptionFilterAttribute 继承的 class 没有提供允许提供重定向的 URL 的参数。很抱歉问题不完整,感谢您花时间回答。
/// <summary>
/// This attribute will handle exceptions thrown by an action method in a consistent way
/// by mapping an exception type to the desired HTTP status code in the response.
/// It may be applied multiple times to the same method.
/// </summary>
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
public sealed class HandleExceptionAttribute : ExceptionFilterAttribute
{
已编辑:感谢您更新问题。虽然我仍然不确定为什么要在此 WebApi 方法中重定向。希望这个答案能有所帮助。
我会处理 HandleExceptionAttribute 中的所有异常逻辑。您甚至可以使用您正在寻找的 302 代码从那里重定向。您的 HandleExceptionAttribute 看起来像这样(我包含了 3 种不同的基于异常返回结果的方法):
public sealed class HandleExceptionAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
//TODO: we can handle all types of exceptions here. Out of memory, divide by zero, etc etc.
if (context.Exception is InvalidOperationException)
{
var httpResponseMessage = context.Request.CreateResponse(HttpStatusCode.Redirect);
httpResponseMessage.Headers.Location = new Uri("http://www.YourRedirectUrl");
throw new HttpResponseException(httpResponseMessage);
}
if (context.Exception is UnauthorizedAccessException)
{
context.Response = context.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, context.Exception.Message);
return;
}
if (context.Exception is TimeoutException)
{
throw new HttpResponseException(context.Request.CreateResponse(HttpStatusCode.RequestTimeout, context.Exception.Message));
}
context.Response = context.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Unable to process your request.");
}
}
但是,如果您真的希望它按您要求的方式完成,您可以向 GetHandleException 方法添加第二个参数。这将接收消息字符串(或 URL),然后在 HandleExceptionAttribute 中将重定向 url 添加到参数(ActionArguements):
public IHttpActionResult GetHandleException(int num, string message = "")
{
switch (num)
{
case 12: return Redirect(message); //message string would be your url
default: throw new Exception("base exception");
}
}
然后你的 HandleExceptionAttribute 看起来像这样:
public sealed class HandleExceptionAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
context.ActionContext.ActionArguments["message"] = "your redirect URL";
}
}
根据以下内容即兴创作
public class HandleExceptionAttribute : ExceptionFilterAttribute
{
public Type ExceptionType { get; set; }
public HandleExceptionAttribute(Type exceptionType)
{
ExceptionType = exceptionType;
}
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Exception.GetType()==ExceptionType)
{
var response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.Moved);
response.Headers.Location=new Uri("http://google.co.uk");
response.Content=new StringContent("Message");
actionExecutedContext.Response = response;
}
base.OnException(actionExecutedContext);
}
}
用法
[HandleException(typeof(ExceptionOfTypeA))]
public HttpResponseMessage Get(int id)
{
throw new ExceptionOfTypeA();
}
尽管我看不出在重定向到可视页面时在其中包含内容有什么意义。但我们开始了