2013-02-15 4 views
3

Я создаю веб-сервис REST с помощью ServiceStack. Я хочу разрешить междоменный запрос, поэтому я зарегистрировал плагин CorsFeature.ServiceStack возвращает 405 на запрос OPTIONS

Мой AppHost выглядит следующим образом:

public class HomeAppHost : AppHostHttpListenerBase 
{ 
    public Context Context { get; set; } 

    public HomeAppHost(Context context) 
     : base("HomeAutomation", typeof(HomeInterfaceService).Assembly) 
    { 
     Context = context; 
    } 

    public override void Configure(Funq.Container container) 
    { 
     Plugins.Add(new CorsFeature()); 

     Routes 
      .Add<HomeInterface>("/HomeInterface") 
      .Add<HomeInterface>("/HomeInterface/{Id}") 
      .Add<ViewModel>("/ViewModel") 
      .Add<FunctionInput>("/Function") 
     ; 
    } 
} 

Затем, когда запрос OPTIONS делается на службе, это приводит к 405 Method Not Allowed:

Запрос:

OPTIONS /Function HTTP/1.1 
Host: localhost:1337 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0 FirePHP/0.7.1 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: nl,en-us;q=0.7,en;q=0.3 
Accept-Encoding: gzip, deflate 
DNT: 1 
Origin: http://localhost 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: content-type 
x-insight: activate 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 

Реакция:

HTTP/1.1 405 Method Not Allowed 
Content-Length: 1837 
Content-Type: application/xml 
Server: Microsoft-HTTPAPI/2.0 
Date: Fri, 15 Feb 2013 20:19:33 GMT 

Редактировать


Добавление метода пустой опции к услуге действительно предотвратить 405 от того срабатывает. Тем не менее, ответ кажется пустым:

HTTP/1.1 200 OK 
Transfer-Encoding: chunked 
Server: Microsoft-HTTPAPI/2.0 
Date: Sat, 16 Feb 2013 08:44:21 GMT 

Добавление следующее также дает мне пустой ответ:

RequestFilters.Add((httpReq, httpRes, requestDto) => 
{ 
    //Handles Request and closes Responses after emitting global HTTP Headers 
    if (httpReq.HttpMethod == "OPTIONS") 
     httpRes.End(); 
}); 

я должен был изменить httpReq.Method к httpReq.HttpMethod и httpRes.EndServiceStackRequest() на httpRes.End(). Это верно?

ответ

2

Не уверен, является ли это правильный путь, но я теперь обработки CORS сам, используя запрос фильтра:

RequestFilters.Add((httpReq, httpRes, requestDto) => 
{ 
    httpRes.AddHeader("Access-Control-Allow-Origin", "*"); 

    if (httpReq.HttpMethod == "OPTIONS") 
    { 
     httpRes.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); 
     httpRes.AddHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type"); 
     httpRes.End(); 
    } 
}); 
+0

Любая идея, как будут выглядеть версии VB.net? – Iladarsda

+0

Попробуйте http://converter.telerik.com/ – sroes

2

в ServiceStack означает, что этот метод не был реализован.

Поэтому вам нужно добавить обработчик для глагола Options. Тело метода может быть пустым, например:

public MyService : Service 
{ 
    public void Options(HomeInterface request) {} 
} 

Если вы хотите, чтобы все опции запросов (т.е. независимо от того, какую услугу она есть), вы можете зарегистрировать глобальный запрос фильтра, как:

this.RequestFilters.Add((httpReq, httpRes, requestDto) => { 
    //Handles Request and closes Responses after emitting global HTTP Headers 
    if (httpReq.Method == "OPTIONS") 
     httpRes.EndServiceStackRequest(); 
}); 

Вы можете использовать ту же логику в Filter Attributes, если хотите более мелкомасштабный контроль над обработкой запросов параметров.

+0

CorsFilter должен обрабатывать использование CORS ОПЦИЯ. Поэтому я не уверен, что ваш ответ действительно отвечает на вопрос. – bmargulies

+0

Атрибут [EnableCors Attribute] (https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.ServiceInterface/Cors/EnableCorsAttribute.cs) испускает только указанные заголовки CORS. Он не обрабатывает неявно обрабатывать ** Параметры ** или любой другой HTTP-глагол. – mythz

+0

Спасибо, это не работало для меня, хотя. См. Мое редактирование. – sroes

2

Я был немного смущен об этом поведении. Не хотел создавать манекены Options() методов для каждой службы и добавлять поддельные маршруты в каждом классе Dto. Все, что мне нужно - этот ServiceStack AppHost ответил на запрос «ВАРИАНТЫ» на каждом URL-адресе с таким же поведением. Так вот что я закончил.

создал свой собственный обработчик для вариантов:

public class OptionsRequestHandler : IHttpHandler, IServiceStackHttpHandler 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     ProcessRequest(null, new HttpResponseWrapper(context.Response), null);   
    } 

    public void ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, string operationName) 
    { 
     httpRes.EndServiceStackRequest(); 
     return; 
    } 
} 

Затем добавили его в методе хоста Настройка:

this.CatchAllHandlers.Add((httpMethod, pathInfo, filePath) => 
{ 
    if ("OPTIONS".Equals(httpMethod, System.StringComparison.InvariantCultureIgnoreCase)) 
     return new OptionsRequestHandler(); 
    else return null; 
}); 

И, конечно, не забыл CorsFeature:

host.Plugins.Add(new ServiceStack.ServiceInterface.Cors.CorsFeature()); 

Так что это way ServiceStack отвечает «200 OK» для каждого запроса с заголовком «OPTIONS», независимо от url, dto и servi .

+0

Я пробовал ваш подход, а теперь вместо 404 я получаю 500 из-за «throw new System.NotImplementedException()». Вы этого не понимаете? – Dema

+0

нет. похоже, что вы столкнулись с условиями, когда этот фильтр вызывается оригинальной маршрутизацией IHttpHandler, а не IServiceStackHttpHandler. возможно, где-то внутри или т. д. просто измените первое содержимое метода ProcessRequest() как [здесь] (https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack/ServiceStackHttpHandler.cs) – justmara

+0

@Dema Modify содержимое метода «ProcessRequest (HttpContext context)» - вместо исключения исключения добавьте следующее: «ProcessRequest (null, new HttpResponseWrapper (context.Response), null);' – eXavier

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