Как включить методы PUT и DELETE HTTP, выполняющие Nancy в xsp4 на Mono?
Я, должно быть, упускаю что-то невероятно легкое. Я пишу приложение NancyFx с использованием Xamarin Studio. Я хочу использовать HTTP-методы PUT и DELETE в моем модуле, но когда я выполняю запрос PUT или DELETE, я получаю обратно 405 Method Not Allowed
и я вижу Allow: GET, POST
в заголовке ответа HTTP.
Мое приложение работает под xsp4 в Xamarin Studio на OSX. Большинство решений, которые я видел для этой проблемы, имеют отношение только к работе под управлением IIS.
Как включить PUT и DELETE в xsp4/Mono/Nancy? Я не верю, что проблема в Нэнси. Я почти уверен, что это ограничено сервером xsp4 на Mono. Я что-то упустил в своем файле web.config (опубликованном ниже)?
Обработчик DELETE в моем модуле Nancy выглядит так:
Delete["/api/family/{id}"] = _ =>
{
int rows = 0;
using (IDbConnection con = dbFactory.Open())
rows = con.Execute("DELETE FROM Family WHERE Id=?", new { Id = _.id });
return Response.AsJson(rows, HttpStatusCode.OK);
};
Мой файл web.config очень прост. Это в значительной степени просто включает Нэнси на всех путях и глаголах, вот так:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*" />
</httpHandlers>
<compilation>
<assemblies>
<add assembly="Mono.Data.Sqlite, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
<add assembly="System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</assemblies>
</compilation>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<httpErrors existingResponse="PassThrough" />
<handlers>
<add name="Nancy" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*" />
</handlers>
</system.webServer>
</configuration>
Вот HTTP-разговор от curl:
> PUT /api/family HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:8080
> Accept: */*
> Content-Type: application/json
> Content-Length: 262
>
* upload completely sent off: 262 out of 262 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 405 Method Not Allowed
< Date: Sun, 27 Jul 2014 21:37:46 GMT
< Server: Mono.WebServer2/0.4.0.0 Unix
< Allow: GET, POST
< X-AspNet-Version: 4.0.30319
< Content-Length: 0
< Cache-Control: private
< Content-Type: text/html
< Keep-Alive: timeout=15, max=100
* HTTP/1.0 connection set to keep alive!
< Connection: Keep-Alive
<
* Connection #0 to host localhost left intact
1 ответ
Немного поздно, но это может быть проблемой, связанной с необходимостью включить метод DELETE на CORS в загрузчике Nancy:
protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context)
{
base.RequestStartup(container, pipelines, context);
//CORS Enable
pipelines.AfterRequest.AddItemToEndOfPipeline((ctx) =>
{
ctx.Response.WithHeader("Access-Control-Allow-Origin", "*")
.WithHeader("Access-Control-Allow-Methods", "POST,GET,DELETE")
.WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type");
});