DeleteAsync - błąd 405 Method Not Allowed

0

Cześć
W aplikacji mam obsługę kasowania obiektu z ListView i wszystko idzie dobrze do momentu wysłania żądania do API. Zmienna response zwraca komunikat:
{StatusCode: 405, ReasonPhrase: 'Method Not Allowed', Version: 1.1, Content: System.Net.Http.HttpConnection+HttpConnectionResponseContent, Headers:
{
Server: Microsoft-IIS/10.0
Request-Context: appId=cid-v1:caf98ff8-47dd-4ba8-95f3-a66386aa74a7
X-Powered-By: ASP.NET
Date: Sat, 01 May 2021 1335 GMT
Allow: GET
Allow: POST
Allow: PUT
Content-Length: 0
}}
API działa poprawnie bo kiedy używam DELETE na Postman wskazane obiektu usuwają się. Czytałem w dokumentacji że to konflikt między ApplicationHost.config a Web.config, jednak u mnie ten drugi plik wygląda inaczej niż w dokumentacji. Spotkał się ktoś z takim problemem?

public async Task DeleteDefectAsync(int id)
        {
            Uri uri = new Uri(string.Format(Constants.DefectsRestUrl, id));

            try
            {
                HttpResponseMessage response = await client.DeleteAsync(uri);

                if (response.IsSuccessStatusCode)
                {
                    Debug.WriteLine(@"\tDefect successfully deleted.");
                }

            }
            catch (Exception ex)
            {
                Debug.WriteLine(@"\tERROR {0}", ex.Message);
            }
        }
1

Może wystarczy atrybut:

[HttpDelete]
public async Task DeleteDefectAsync(int id)
{
}

W którym miejscu dajesz parametr int id?
1.

https://moje.api.com/1

2

https://moje.api.com?ID=1

3
W body

Myślę, że dobrze by też było uświadomić api, w którym miejscu będzie ID np.:

[HttpDelete]
public async Task DeleteDefectAsync([FromRoute] int id)
{
    // przykład - https://moje.api.com/2
}

lub

[HttpDelete]
public async Task DeleteDefectAsync([FromQuery] int id)
{
    // przykład - https://moje.api.com?ID=2
}
0

@Ktos:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\InspectionMobileApp.WebAPI.dll" stdoutLogEnabled="false" stdoutLogFile="\\?\%home%\LogFiles\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>
<!--ProjectGuid: 1ab7e9aa-b1b8-4e8e-9f58-2e19fba494c5-->

0

A jesteś w stanie podejrzeć jaki request faktycznie idzie pod spodem? np. Fiddlerem?

ewentualnie RestSharpem to wysłać :D

1

Wróciłem do tematu i problem okazał się bardzo prozaiczny. Po prostu po stronie aplikacji w metodzie odpowiedzialnej za usuwanie wybranego rekordu źle budowałem uri...
Było tak:

Uri uri = new Uri(Constants.DefectsRestUrl);

A powinno być tak:

Uri uri = new Uri(Constants.DefectsRestUrl+"/"+id);
4

A nawet tak:
Uri uri = new Uri($"{Constants.DefectsRestUrl}/{id}");

0

A nawet tak:

Uri uri = new(Constants.DefectsRestUrl, $"{id}");

zakładając że Constants.DefectsRestUrl będzie poprawnie typu Uri

1 użytkowników online, w tym zalogowanych: 0, gości: 1