我感谢任何帮助,因为该网站应该今晚上线!
我有一个带有Delete方法的web api控制器。该方法在运行IIS Express(Windows 8)的本地计算机上正常运行,但只要我将其部署到实时IIS服务器(Windows Server 2008 R2),它就会停止工作并抛出以下错误消息:
HTTP错误405.0 - 不允许的方法 无法显示您要查找的页面,因为正在使用无效方法(HTTP Verb)
我在网上寻找解决方案,并实施了最合理的解决方案。我的网络配置包含以下设置:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<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>
</system.webServer>
我还试图在IIS中更改处理程序映射和请求筛选无济于事。请注意,IIS中的WebDAV创作规则似乎已被禁用。
任何想法将不胜感激 感谢。
答案 0 :(得分:177)
我最终找到了解决方案! 如果您遇到同样的问题,请将以下内容添加到您的web.config
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/> <!-- ADD THIS -->
</modules>
... rest of settings here
我希望这会有所帮助
答案 1 :(得分:54)
在某些情况下,仅从模块中删除它会产生下一个错误:
提出了解决方案here。还需要从处理程序中删除它。500.21 处理程序“WebDAV”在其模块列表中有一个错误的模块“WebDAVModule”
模块:IIS Web核心通知:ExecuteRequestHandler“
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
答案 2 :(得分:30)
就我而言,上述解决方案均无效。这是因为我在Delete
方法中更改了参数名称。
我有
public void Delete(string Questionid)
而不是
public void Delete(string id)
我需要使用id
名称,因为这是我WebApiConfig
文件中声明的名称。请注意第三行和第四行中的id
名称:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我从here得到了这个解决方案。
答案 3 :(得分:13)
HTTP DELETE
动词的Javascript必须如下:
$.ajax({
**url: "/api/SomeController/" + id,**
type: "DELETE",
dataType: "json",
success: function(data, statusText) {
alert(data);
},
error: function(request, textStatus, error) {
alert(error);
debugger;
}
});
不使用以下内容:
...
data: {id:id}
...
与使用POST
方法时一样。
答案 4 :(得分:5)
如果使用的是IIS 7.0或更高版本。 此问题主要与IIS服务器上的WebDAV扩展模块有关。 这是在使用“发布或删除”操作时发生的。
请尝试在网络配置中进行以下设置
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
答案 5 :(得分:3)
我也有同样的问题,我正在调用WebAPi并且收到此错误。 在web.config中为服务添加以下配置解决了我的问题
apply plugin: 'com.android.application'
android {
compileSdkVersion 19
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.example.zephyr.myapplication"
minSdkVersion 15
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
full {
minSdkVersion 14
applicationId 'full'
targetSdkVersion 17
}
home {
minSdkVersion 14
applicationId 'home'
targetSdkVersion 17
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
web.config文件中的解决了我的问题。 这就是我如何从客户端打电话
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/> <!-- add this -->
</modules>
答案 6 :(得分:3)
在尝试了几乎所有解决方案后,这对我有用。 在您的API配置文件中添加它
<system.webServer>
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<modules>
<remove name="WebDAVModule" />
</modules>
</system.webServer>
答案 7 :(得分:2)
转到applicationHost.config(通常在C:\ Windows \ System32 \ inetsrv \ config下)并注释掉applicationHost.config中的以下行
1)在&lt; handlers&gt;下:
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
2)同时注释掉上述处理程序在&lt; modules&gt;
下引用的以下模块<add name="WebDAVModule" />
答案 8 :(得分:1)
我有405错误方法不允许,因为我省略了将WebApi控制器上的Delete方法公开。
我花了很长时间才找到这个(太长了!),因为在这种情况下我会预料到Not Found错误,所以我错误地假设我的Delete方法被拒绝了。
不允许而不是未找到的原因是我也有一个相同路由的Get方法(这是实现REST时的正常情况)。公共Get函数与路由匹配,然后由于错误的http方法而被拒绝。
我知道一个简单的错误,但可能会节省一些时间。
答案 9 :(得分:1)
只是添加。如果这是你的配置
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }
请像Hugo说的那样继续做,并且不要将Route属性设置为控制器get方法,这在我的情况下会出现问题。
答案 10 :(得分:1)
在我的情况下,我错过了将[Route("")]
添加到[Route("{id}")]
的操作,但遇到了同样的错误。
补充说,这为我解决了这个问题:{{1}}
答案 11 :(得分:0)
[HttpPost]属性为我解决了这个问题:
[HttpPost]
public void Delete(int Id)
{
//Delete logic
}
答案 12 :(得分:0)
我有类似的问题,但对于PUT - 其他建议都没有对我有用。
但我使用的是int
而不是默认的string
。在路线上添加{id:int}
解决了我的问题。
[Route("api/Project/{id:int}")]
public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
{
...
}
答案 13 :(得分:0)
我们必须在web.config中添加自定义标头,因为我们的请求有多个标头会混淆API响应。
<httpProtocol>
<customHeaders>
<remove name="Access-Control-Allow-Methods" />
<remove name="Access-Control-Allow-Origin" />
<remove name="Access-Control-Allow-Headers" />
</customHeaders>
</httpProtocol>