2015-08-27 6 views
2

Я использую WebAPI назвать некоторые методы третьей стороны:Web API Исключение Упаковочный

public class SessionsController : ApiController 
{ 
    public DataTable Get(int id) 
    { 
     return Services.TryCall(es => es.GetSessionList(id).Tables[0]); 
    } 
} 

Я оборачивать все звонки на этой услуги:

internal static class Services 
{ 
    internal static IExternalService ExternalService { get; set; } 

    internal static T TryCall<T>(Func<IExternalService,T> theFunction) 
    { 
     try 
     { 
      return theFunction(ExternalService); 
     } 
     catch (FaultException<MyFaultDetail> e) 
     { 
      var message = new HttpResponseMessage(HttpStatusCode.NotImplemented); 
      message.Content = new StringContent(e.Detail.Message); 
      throw new HttpResponseException(message); 
     } 
    } 
} 

Когда исключение, его пойман и сообщение подготовлено. С ретрованием я получаю новое сообщение об ошибке:

Обработка запроса HTTP привела к исключению. Подробнее см. Ответ HTTP, возвращенный свойством «Ответ» этого исключения.

Как я могу вернуть это исключение должным образом, без жалобы Visual Studio? Когда я пропускаю ошибку, браузер получает результат ошибки 501. Метод Request.CreateResponse() недоступен в моем методе обертки.

+0

'Request.CreateResponse()' недоступен? Вы можете сделать это доступным, не так ли? –

+0

Afaik методы расширения наследуются из базового класса ApiController. Так что это не в моем классе Services ... –

+0

Передайте объект 'Request' в метод' TryCall'? – DavidG

ответ

3

Ну, хотя это может сработать, я рекомендую вам создать для этого ExceptionFilterAttribute. Таким образом, вам не придется защищать каждый метод исключения с тем же раздутым кодом.

Например:

public class FaultExceptionFilterAttribute : ExceptionFilterAttribute 
    { 
     public override void OnException(HttpActionExecutedContext context) 
     { 
      if (context.Exception is FaultException) 
      { 
       context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented); 
      } 
     } 
    } 

Есть несколько способов, которые вы можете использовать этот фильтр:

1. Действие

Чтобы применить фильтр к конкретному действию, добавьте фильтр в качестве атрибута для действия:

public class SampleController : ApiController 
{ 
    [FaultExceptionFilter] 
    public Contact SampleMethod(int id) 
    { 
     //Your call to a method throwing FaultException 
     throw new FaultException<MyFaultDetail>("This method is not implemented"); 
    } 
} 

2. Контроллер:

Чтобы применить фильтр, чтобы все действия на контроллере, добавить фильтр в качестве атрибута класса контроллера:

[FaultExceptionFilter] 
public class SampleController : ApiController 
{ 
    // ... 
} 

3. Глобально

Чтобы применить фильтр глобально ко всем контроллерам Web API, добавьте экземпляр фильтра в коллекцию GlobalConfiguration.Configuration.Filters. Фильтры Exeption в этой коллекции применяются к любому действию контроллера веб-API.

GlobalConfiguration.Configuration.Filters.Add(new FaultExceptionFilterAttribute()); 

Если вы используете шаблон проекта «ASP.NET MVC 4 веб-приложений», чтобы создать свой проект, поместите код конфигурации API Web внутри WebApiConfig класса, который находится в папке App_Start:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Filters.Add(new FaultExceptionFilterAttribute()); 

     // Other configuration code... 
    } 
} 
+0

Я попробовал ваше решение, а затем визуальная студия жаловалась на необработанный метод ThrowFaultException .. тот же, но другой:/ –

+0

@DanielR. Вы что-то написали в ответ в Атрибуте? VS будет генерировать исключение локально, поскольку вы можете быть в режиме отладки. Он просто вернет ответ, указанный в атрибуте, если он настроен правильно. –

+0

Если вы можете показать, что вы пробовали, мы сможем помочь –

Смежные вопросы