101

このエラーは非常に一般的であり、すべての解決策を試しましたが、どれも機能しませんでした。コントロール パネルで WebDAV 公開を無効にし、これを Web 構成ファイルに追加しました。

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

エラーは引き続き発生します。これはコントローラーです:

   static readonly IProductRepository repository = new ProductRepository();

    public Product Put(Product p)
    {
        return repository.Add(p);
    }

メソッドの実装:

 public Product Add(Product item)
    {
        if (item == null)
        {
            throw new ArgumentNullException("item");
        }
        item.Id = _nextId++;
        products.Add(item);
        return item;
    }

そして、これが例外がスローされる場所です。

client.BaseAddress = new Uri("http://localhost:5106/");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));      
var response = await client.PostAsJsonAsync("api/products", product);//405 exception

助言がありますか?

4

24 に答える 24

74

あなたはクライアントから投稿しています:

await client.PostAsJsonAsync("api/products", product);

PUTしていません。

Web API メソッドは、PUT 要求のみを受け入れます。

そう:

await client.PutAsJsonAsync("api/products", product);
于 2013-03-30T12:58:41.453 に答える
64

私にも同じ例外がありました。私の問題は、私が使用したことでした:

using System.Web.Mvc; // Wrong namespace for HttpGet attribute !!!!!!!!!
[HttpGet]
public string Blah()
{
    return "blah";
}

あるべき

using System.Web.Http; // Correct namespace for HttpGet attribute !!!!!!!!!
[HttpGet]
public string Blah()
{
    return "blah";
}
于 2014-02-24T21:20:00.143 に答える
18

DELETEメソッドを機能させるために多くのことを試みました(Web APIを許可されていない405メソッドを取得していました)、最後に[Route("api/scan/{id}")] をコントローラーに追加し、正常に動作しました。この投稿が誰かの役に立てば幸いです。

     // DELETE api/Scan/5
    [Route("api/scan/{id}")]
    [ResponseType(typeof(Scan))]
    public IHttpActionResult DeleteScan(int id)
    {
        Scan scan = db.Scans.Find(id);
        if (scan == null)
        {
            return NotFound();
        }

        db.Scans.Remove(scan);
        db.SaveChanges();

        return Ok(scan);
    }
于 2014-09-03T03:14:15.847 に答える
4

メソッドがパラメーターを予期していて、それを渡していない場合にも、405 エラーが発生する可能性があります。

これは機能しません (405 エラー)

HTML ビュー/Javascript

$.ajax({
         url: '/api/News',
         //.....

ウェブ API:

public HttpResponseMessage GetNews(int id)

したがって、メソッドのシグネチャが上記のような場合は、次のことを行う必要があります。

HTML ビュー/Javascript

$.ajax({
         url: '/api/News/5',
         //.....
于 2015-09-03T20:37:10.013 に答える
2

【HttpPost】不要!

[Route("")]
public void Post(ProductModel data)
{
    ...
}
于 2014-08-21T10:39:13.737 に答える
2

これを解決できませんでした。POST が void を返す限り、CORS を有効にして動作させていました (ASP.NET 4.0 - WEBAPI 1)。HttpResponseMessage を返そうとすると、HTTP 405 応答を受け取り始めました。

上記のLladの回答に基づいて、私は自分の参考文献を調べました。

POST メソッドの上に属性 [System.Web.Mvc.HttpPost] をリストしました。

これを使用するように変更しました:

[System.Web.Http.HttpPostAttribute]
[HttpOptions]
public HttpResponseMessage Post(object json)        
{
    ...
    return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
}

これで私の悩みは解決しました。これが他の誰かに役立つことを願っています。

完全を期すために、web.configに次のものがありました。

<httpProtocol>
    <customHeaders>
        <clear />
        <add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE" />
        <add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" />
        <remove name="X-Powered-By" />
    </customHeaders>
</httpProtocol>
于 2016-03-09T17:47:16.627 に答える
1

私の場合、私の POST ハンドラーは次の形式でした。

[HttpPost("{routeParam}")]
public async Task<ActionResult> PostActuality ([FromRoute] int routeParam, [FromBody] PostData data)

次のように、引数を交換する必要があることがわかりました。つまり、最初に本体データ、次にルートパラメーターです。

[HttpPost("{routeParam}")]
public async Task<ActionResult> PostActuality ([FromBody] PostData data, [FromRoute] int routeParam)
于 2019-11-15T15:29:28.697 に答える
0

プロジェクトの .csproj ファイルをチェックインして変更します

<IISUrl>http://localhost:PORT/</IISUrl>

このようなあなたのウェブサイトのURLに

<IISUrl>http://example.com:applicationName/</IISUrl>
于 2017-01-11T07:15:55.763 に答える