如何为302状态代码使用handleexeption批注时如何指定位置

时间:2016-02-23 19:37:47

标签: c# asp.net-mvc visual-studio asp.net-web-api2 webapi2

使用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");
     }
}

编辑: 对不起,我有点仓促地问了这个问题。上面的类使用HandleExceptionAttribute类,该类继承自ExceptionFilterAttribute。在我尝试调试单元测试时,我没有意识到这一点。问题不会出现在单元测试中,但会出现使用需要重定向网址的Visual Studio .webtest。从ExceptionFilterAttribute继承的类未提供允许提供重定向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
   {

2 个答案:

答案 0 :(得分:3)

编辑:感谢您更新了问题。虽然我还不确定你为什么要在这个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";

    }
}

答案 1 :(得分:0)

从以下

即兴发挥
 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();
    }

虽然我没有看到在重定向到可视页面时有内容的意义。但我们去了