ASP NET web api POST / DELETE (Angular 6 HttpClient-) возвращает: 405 Метод не разрешен - PullRequest
0 голосов
/ 19 декабря 2018

Я создал приложение с Visual Studio 15, используя веб-API ASP.NET в качестве бэкэнда и Angular 6 в интерфейсе.Я просто хочу показать / добавить / удалить пользователя во внешнем интерфейсе на основе данных в базе данных.Мне удалось это с помощью HttpClient в Angular 6 и GET-Request, чтобы показать, что данные пользователей работают нормально.Я попытался реализовать запрос POST / DELETE таким же образом.Вот вызов из Angular:

deleteUser(id: number): Observable<{}> {
    const url = `${this.userURL}/${id}`;
    return this.http.delete(url, { withCredentials: true })
        .pipe(
            catchError(this.handleError('deleteData'))
        );
}

веб-API: я обработал предварительный запрос в Global.asax.cs:

void Application_PreSendRequestHeaders(Object sender, EventArgs e)
    {
        var origin = Request.Headers.Get("Origin");
        var validOrigins = ConfigurationManager.AppSettings["allowedCorsOrigins"].Split(',');
        if (validOrigins.Any(o => o == origin))
        {
            Response.StatusCode = (int)HttpStatusCode.OK;
            Response.Headers.Set("Access-Control-Allow-Origin", origin);
            Response.Headers.Set("Access-Control-Allow-Credentials", "true");
            Response.Headers.Set("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, access-control-allow-credentials, access-control-allow-headers, access-control-allow-methods, access-control-allow-origin, ontent-type, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization"); // "Content-Type, Accept, Authorization, withcredentials, Prefer"
            Response.Headers.Set("Access-Control-Expose-Headers", "Claims, *");
            Response.Headers.Set("Access-Control-Allow-Methods", "GET,PUT,POST,OPTIONS,PATCH,DELETE");
        }
    }

WebApiConfig.cs:

 public static void Register(HttpConfiguration config)
        {

            // enable Cors
            var cors = new EnableCorsAttribute("http://localhost:4200", "*", "GET, POST, PUT, DELETE, OPTIONS"){ SupportsCredentials = true};
            config.EnableCors(cors);
            // ...

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

автоматически сгенерированная функция удаления в контроллере: UserController.cs:

// DELETE: api/User/5
    [HttpDelete]
    [ResponseType(typeof(User))]
    public async Task<IHttpActionResult> DeleteUser(decimal id)
    {
        User user = await db.User.FindAsync(id);
        if (user == null)
        {
            return NotFound();
        }

        db.User.Remove(user);
        await db.SaveChangesAsync();

        return Ok(user);
    }

web.config.cs:

<appSettings>
   <add key="webpages:Version" value="3.0.0.0" />
   <add key="webpages:Enabled" value="false" />
   <add key="ClientValidationEnabled" value="true" />
   <add key="UnobtrusiveJavaScriptEnabled" value="true" />
   <add key="allowedCorsOrigins" value="http://localhost:4200" />
   <add key="allowedCorsMethods" value="GET, POST, PUT, DELETE, OPTIONS, BATCH" />
   <add key="allowedCorsHeaders" value="*" />
</appSettings>
<system.web>
   <compilation debug="true" targetFramework="4.5.2" />
   <httpRuntime targetFramework="4.5.2" />
   <httpModules>
     <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
   </httpModules>
</system.web>
<system.webServer>
   <validation validateIntegratedModeConfiguration="false" />
   <modules runAllManagedModulesForAllRequests="true">
     <remove name="WebDAVModule" />
     <remove name="ApplicationInsightsWebTracking" />
     <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
   </modules>
   <handlers>
     <remove name="WebDAV" />
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
     <remove name="OPTIONSVerbHandler" />
     <remove name="TRACEVerbHandler" />

     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

Если я нажимаю F12 в браузере клиента, чтобы открытьсредства разработки, код ответа веб-API на запрос предварительной проверки и, наконец, запрос DELETE равен 200, как и ожидалось, но если я нажимаю «понимание приложения» в Visual Studio, код ответа на предварительную проверку составляет 401, а для DELETE - 405В результате пользователь не удаляется.

Клиент:

  • Параметры - 200

  • Удалить - 200

Сервер: (в Applications Insights)

  • Опции - 401

  • Удалить - 405

Я взглянул на несколько похожих вопросов в stackoverflow, ноДанные решения не повлияли на мою проблему и не решили ее.Я могу предоставить больше исходного кода, если это необходимо.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Я исправил свою проблему, просто вставив [Route("api/User/{id}")] ниже [HttpDelete].Функция удаления в UserController.cs теперь выглядит так:

[HttpDelete]
[Route("api/User/{id}")]
[ResponseType(typeof(User))]
public async Task<IHttpActionResult> DeleteUser(decimal id)
{
    ...
}
0 голосов
/ 19 декабря 2018

Я не совсем уверен в этом, но вы можете попробовать изменить сигнатуру функции на DeleteUser(int id) (честно говоря, десятичный параметр id выглядит таким раздражающим :)) и проверить шаблон маршрута вашего конфигурационного файла (routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }) на соответствиеВаше имя параметра (в данном случае идентификатор).Надеюсь, что это решит вашу проблему.

...