it-swarm.com.de

ASP.NET WebApi: (405) Methode nicht zulässig

Ich habe einen Web-API-Controller. Es verhält sich sehr seltsam. Wenn ich PostMan verwende, kann ich auf die Methode POST in der Web-API zugreifen, aber wenn ich HttpWebRequest von .net verwende, wird die (405) -Methode nicht zugelassen. . Ich gebe den Web-API-Code hier ein:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;

namespace MyProject.Controllers
{
    public class TestController : ApiController
    {
        [HttpPost]
        public int buy(OrderResult value)
        {
            try
            {
                if (value.InvoiceDate != null && value.Result == 1)
                {
                    return 0;
                }
            }
            catch{}

            return -1;
        }
    }

    public class OrderResult
    {
        public int Result { get; set; }
        public long InvoiceNumber { get; set; }
        public string InvoiceDate { get; set; }
        public long TimeStamp { get; set; }
    }
}

Hier ist meine WebApiConfig.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace MyProject
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional }
            );

        }
    }
}

So sende ich die Anforderung POST aus einem anderen .NET-Projekt:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;

namespace MyProject.Controllers
{
    public static class WebReq
    {
        public static string PostRequest(string Url, string postParameters)
        {
            try
            {
                HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(Url);
                myReq.Method = "POST";
                myReq.Timeout = 30000;
                myReq.Proxy = null;

                byte[] postData = Encoding.UTF8.GetBytes(postParameters);
                myReq.ContentLength = postData.Length;
                myReq.ContentType = "application/x-www-form-urlencoded";
                using (Stream requestWrite = myReq.GetRequestStream())
                {
                    requestWrite.Write(postData, 0, postData.Length);
                    requestWrite.Close();
                    using (HttpWebResponse webResponse = (HttpWebResponse)myReq.GetResponse())
                    {
                        if (webResponse.StatusCode == HttpStatusCode.OK)
                        {
                            using (Stream str = webResponse.GetResponseStream())
                            {
                                using (StreamReader sr = new StreamReader(str))
                                {
                                    return sr.ReadToEnd();
                                }
                            }
                        }
                        return null;
                    }
                }
            }
            catch (Exception e)
            {
                var message = e.Message;
                return null;
            }
        }

    }
}

Ich habe bereits den folgenden Code in meine web.config eingefügt:

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule" />
</modules>

Es ist merkwürdig, weil ich POST erfolgreich von PostMan abschicken kann. Der PostMan sendet diesen Code an die API.

POST /api/Test/buy HTTP/1.1
Host: domain.com
Cache-Control: no-cache
Postman-Token: 9220a4e6-e707-5c5f-ea61-55171a5dd95f
Content-Type: application/x-www-form-urlencoded

InvoiceDate=28012016&Result=1

Ich freue mich über jeden Vorschlag, das Problem zu lösen.

6
TechTotal

Ich habe die Lösung gefunden. 

Ich habe die Anfrage von Fiddler überprüft. Wenn ich eine POST -Anforderung an die API sende, wird sie automatisch mit demselben neuen Parameter an dieselbe Adresse umgeleitet. AspxAutoDetectCookieSupport=1

So entfernen Sie AspxAutoDetectCookieSupport = 1

Schließlich änderte ich den cookieless="AutoDetect" in web.config in cookieless="UseCookies" und das Problem wurde behoben.

2
TechTotal

Ich weiß, dass dies ein alter Beitrag ist, aber vielleicht könnte dies jemand anderem helfen. Ich hatte gerade ein ähnliches Problem und bekam einen 405-Fehler "Get not allow", als ich eindeutig einen Postboten hatte. Es stellte sich heraus, dass ich die URL mit http anstelle von https übermittelte. Das Umschalten auf https wurde behoben.

3
Paul Reedy
     byte[] postData = Encoding.UTF8.GetBytes(postParameters);
            myReq.ContentLength = postData.Length;
            myReq.ContentType = "application/x-www-form-urlencoded";
            using (Stream requestWrite = myReq.GetRequestStream())
            {
                requestWrite.Write(postData, 0, postData.Length);

Sie senden wahrscheinlich keine richtige x-www-form-urlencoded-Anfrage. Sie verschlüsseln die Daten wahrscheinlich nicht ordnungsgemäß von dem, was als postParameters übergeben wird. Siehe Formulardaten mit HttpWebRequest veröffentlichen

Da Sie kein gültiges OrderResult-Objekt gemäß x-www-form-urlencoded generieren, wählt die Routenauswahl Ihre Buy-Aktion nicht aus. Aus diesem Grund erhalten Sie POST ist nicht zulässig.

Sie würden wahrscheinlich zum Controller gelangen, wenn Sie OrderResult value = null geändert haben, da es jetzt ein optionaler Parameter ist. Dies ist jedoch nicht das, was Sie wollen, es sei denn, Sie haben einen seltsamen Controller, der sich wie folgt verhält:

Buy(OrderResult value = null)
{
    if(value== null)
        value = MyCustomDeserializeFromRequestBody(RequestContext)

    ...
}

Letztendlich sollten Sie diese Klasse wirklich nicht verwenden. Es gibt viel bessere Konstrukte für die moderne Entwicklung https://stackoverflow.com/a/31147762/37055https://github.com/hhariri/EasyHttp von meinem Kopf

2
Chris Marisic

In meinem Fall hatte ich einen physischen Ordner im Projekt mit dem gleichen Namen wie die Route (z. B. Sandbox) und jede POST Anfrage wurde vom statischen Datei-Handler in IIS (offensichtlich) anstelle der WebAPI-Laufzeit.

Es dauerte einige Zeit, bis ich einen irreführenden 405-Fehler anstelle des erwarteten 404-Fehlers erhielt.

Es ist nicht leicht, darauf hereinzufallen, aber es ist möglich. Hoffe es hilft jemandem.

0
Panos Roditakis