C# 在对302状态代码使用handleexeption注释时,如何指定位置

C# 在对302状态代码使用handleexeption注释时,如何指定位置,c#,asp.net-mvc,visual-studio,asp.net-web-api2,webapi2,C#,Asp.net Mvc,Visual Studio,Asp.net Web Api2,Webapi2,使用c#WebAPI2,我的代码会抛出一个InvalidOperationException。返回状态代码302时,如何使用HandleException注释为重定向提供位置 [HandleException(typeof(InvalidOperationException), HttpStatusCode.Found, ResponseContent = "Custom message 12")] public IHttpActionResult GetHandleException(int

使用c#WebAPI2,我的代码会抛出一个
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");
     }
}
编辑: 对不起,我问这个问题有点匆忙。上面的类使用从ExceptionFilterAttribute继承的HandleExceptionAttribute类。我在调试他们的单元测试时没有意识到这一点。这个问题在单元测试中不会出现,但在使用需要重定向url的VisualStudio.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
   {
//
///此属性将以一致的方式处理操作方法引发的异常
///通过将异常类型映射到响应中所需的HTTP状态代码。
///它可以多次应用于同一方法。
/// 
[AttributeUsage(AttributeTargets.Method,Inherited=false,AllowMultiple=true)]
公共密封类HandleExceptionAttribute:ExceptionFilterAttribute
{

编辑:感谢您更新了这个问题。尽管我仍然不确定您为什么要在这个WebApi方法中重定向。希望这个答案能有所帮助。

我将处理HandleExceptionAttribute中的所有异常逻辑。您甚至可以使用正在查找的302代码从此处重定向。您的HandleExceptionAttribute将如下所示(我已包括3种基于异常返回结果的不同方式):

但是,如果确实希望按照要求的方式完成,可以向GetHandleException方法添加第二个参数。这将接收消息字符串(或URL),然后在HandleException属性中向参数添加重定向URL(ActionArguements):

然后您的HandleException属性如下所示:

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属性是您自己的?您可以提供源代码或源链接,看看您可以做些什么来提高其使用率吗?使用异常过滤器并在那里设置重定向逻辑。您还可以将基于条件的重定向设置为过滤器中的方向。请提供更多信息以帮助您找到合适的答案。用户希望根据异常重定向到特定页面。这个问题有点让人困惑。您是否尝试直接抛出异常?如果是,您可以自己创建一个自定义异常,并在其上添加额外数据,如您要重定向到的位置?@Th伊米尔:我已经根据你最新的问题更新了我的答案。
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();
    }