405 WebApi请求上不允许的方法GET& POST - 在Visual Studio中工作

时间:2016-05-17 08:44:16

标签: c# .net asp.net-web-api asp.net-web-api2

我们正处于将项目部署到客户端测试服务器的阶段,但不幸的是,每当我们的应用程序尝试调用我们提供的任何Web Api方法时,我们都会收到405错误。

我的WebApi调用定义如下:

public class TourController : ApiController
{
  [HttpPost]
  public JsonCollection RequestTours([FromBody] DateRequest request){
    // Implementation goes here
  }

  [HttpPost]
  public GroupTour RequestTour([FromBody] int request){
    // Implementation goes here
  }
}

我的WebApi路由如下:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

这些调用在本地运行时通过Visual Studio进行定义,但没有修改,但是当我们将它们放在客户端的IIS测试服务器上时,我们在通过AJAX(主方法)或URL调用方法时始终收到405错误。 / p>

正如其他帖子中所建议的那样,我们尝试在system.webServer中定义以下内容:

<modules runAllManagedModulesForAllRequests="true" />
    <handlers>
      <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>

我们也尝试添加以下内容无效:

<modules runAllManagedModulesForAllRequests="true">
    <remove name="WebDAVModule"/> <!-- add this -->
</modules>

<handlers>
    <remove name="WebDAV" />
    ...
</handlers>

我们目前处于亏损状态,因为我们尝试了围绕同一主题的类似Stack Overflow帖子提供的大多数建议。对此问题的任何帮助或建议将不胜感激!

N.B。

仅仅为了记录,我通过Javascript / JQuery的调用方法正在执行以下操作:

function populateInstances(date) {
                var $container = $('#id-tour_4');
                $.ajax({
                    url: '/api/tour/requesttours',
                    type: 'POST',
                    data: { Date: date },
                    dataType: 'json',
                    success: function (data) {
                        var htmlstring = '';
                        $container.empty();
                        if (data.Results.length > 0) {
                            for (var i = 0; i < data.Results.length; i++) {
                                htmlstring += '<div class="book-title">' + data.Results[i].Name + '</div>';
                                htmlstring += '<div class="tour_select_list_div">';
                                htmlstring += '<ul class="tour_select_list">';
                                for (var j = 0; j < data.Results[i].Instances.length; j++) {
                                    htmlstring += '<li><label for="id-tour_4_' + j + '"><input id="id-tour_4_' + j + '" type="radio" value="' + data.Results[i].Instances[j].TourId + '" name="BookTour.Instance" data-availability="' + data.Results[i].Instances[j].Availability + '" data-adultprice="' + data.Results[i].Instances[j].AdultPrice + '" data-childprice="' + data.Results[i].Instances[j].ChildPrice + '">';
                                    htmlstring += data.Results[i].Instances[j].StartTime + ' - ' + data.Results[i].Instances[j].Title + '</label></li>';
                                }
                                htmlstring += '</ul>';
                                htmlstring += '</div>';
                            }
                        } else {
                            htmlstring += 'There are no tours departing on this date';
                        }
                        $container.append(htmlstring);
                    }
                });
            }

3 个答案:

答案 0 :(得分:1)

在此,找到一些可能有助于解决生产问题的选项

检查清单:

  1. 尝试添加[Route]属性
  2.  [HttpPost]
     [Route("api/tour/requesttours")]
     public JsonCollection RequestTours([FromBody] DateRequest request)
    
       You can try removing `[HttpPost]` when applying the `[Route]` attribute
    
    1. 确保CORS已启用

    2. 检查您是否使用System.Web.Http HttpPost而非Mvc命名空间等效。

答案 1 :(得分:0)

确保您的客户端方法执行您的端点所期望的实际ACTION VERB。

也就是说,你的端点是一个POST,你的客户端必须POST到它而不是PUT。

请确认。

答案 2 :(得分:0)

可能防火墙或负载均衡器问题。如果您的客户端遵循严格的最小权限策略,则可能必须确保在防火墙/负载均衡器层上允许实际动词。你能让你的系统管理员检查一下吗?

您能否确认该请求到达您的服务?您是否有任何记录(在您的应用程序中或至少 IIS日志,它会通知您对您网站的每个请求)确认请求是否通过?您是否已在通信之间放置了一个 Web调试代理,如fiddler,以获取更详细的信息?