我们正处于将项目部署到客户端测试服务器的阶段,但不幸的是,每当我们的应用程序尝试调用我们提供的任何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);
}
});
}
答案 0 :(得分:1)
在此,找到一些可能有助于解决生产问题的选项
检查清单:
[Route]
属性[HttpPost] [Route("api/tour/requesttours")] public JsonCollection RequestTours([FromBody] DateRequest request)
You can try removing `[HttpPost]` when applying the `[Route]` attribute
确保CORS已启用
检查您是否使用System.Web.Http
HttpPost
而非Mvc命名空间等效。
答案 1 :(得分:0)
确保您的客户端方法执行您的端点所期望的实际ACTION VERB。
也就是说,你的端点是一个POST,你的客户端必须POST到它而不是PUT。
请确认。
答案 2 :(得分:0)
此可能是防火墙或负载均衡器问题。如果您的客户端遵循严格的最小权限策略,则可能必须确保在防火墙/负载均衡器层上允许实际动词。你能让你的系统管理员检查一下吗?
您能否确认该请求到达您的服务?您是否有任何记录(在您的应用程序中或至少 IIS日志,它会通知您对您网站的每个请求)确认请求是否通过?您是否已在通信之间放置了一个 Web调试代理,如fiddler,以获取更详细的信息?