[英]How to resolve WCF Rest MethodNotFound (405) Error when appting to PUT via WCF Rest Starter Kit HttpClient
我在這里查看了幾乎所有關於WCF Rest PUT / POST的問題,並且仍然無法確定為什么我無法PUT或POST到我的Web服務,但是能夠通過GET調用測試GetTime方法。
此特定服務交換令牌的自定義憑據信息(用戶名,密碼和其他一些信息)。 該令牌信息被加密並添加到對其他Web服務的后續請求的標頭中,因此不必在任何地方傳遞用戶名/密碼。
所有Web服務調用仍被視為無狀態,但需要此auth標頭信息而不是用戶名/密碼來訪問受保護的服務操作。
合同
[ServiceContract(Namespace = "")]
public interface IUserService
{
[WebInvoke(Method = "PUT", UriTemplate = "users/{username}/session")]
[WebHelp(Comment = "Creates a new session for the specified username")]
[OperationContract]
AuthToken PutSession(string username, CustomCredential credential);
...
[WebInvoke(Method = "GET", UriTemplate = "time")]
[WebHelp(Comment = "Test method; returns the time")]
[RequireAuthToken]
[OperationContract]
DateTime GetTime();
}
服務實施
public class UserService : IUserService
{
#region UserService Members
public AuthToken PutSession(string username, CustomCredential credential)
{
// ...
}
public DateTime GetTime()
{
return DateTime.Now;
}
}
測試代碼
[Fact]
public void When_Authenticated_And_Getting_Time_Expect_200_Status()
{
// arrange
using (var client = Get_HttpClient_With_AuthHeaders()) {
// act
var result = client.Get("time");
// assert
Assert.Equal(HttpStatusCode.OK, result.StatusCode);
}
}
前面提到的GetTime有效(只是我添加的一種測試方法)。
[Fact]
public void When_PuttingSession_Expect_AuthToken_Is_Returned()
{
// arrange
using (var client = Get_HttpClient_With_No_Auth_Headers()) {
var cred = new CustomCredential("test", "password", 1);
var content = HttpContentExtensions.CreateDataContract<CustomCredential>(cred);
// act
HttpResponseMessage response = client.Put("users/test/session", content);
// assert
response.EnsureStatusIsSuccessful();
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
var authToken = response.Content.ReadAsDataContract<AuthToken>();
Assert.NotNull(authToken);
}
}
上面的put返回一個MethodNotAllowed(405) 。
就像另一個測試一樣,我向該服務添加了一個Mex端點,創建了一個新的控制台應用程序,並為此服務添加了“服務參考”。 使用生成的客戶端代理代碼,我能夠執行類似...的操作。
IUserServiceClient client = new IUserServiceClient();
CustomCredential cred = ...
AuthToken token = client.PutSession("test_username", cred);
這表明...
不知道是什么原因造成的。
編輯
我還注意到,IIS必須已經在托管服務的網站的根目錄中創建了該web.config,這似乎允許使用主要的HTTP動詞。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<security>
<requestFiltering>
<verbs>
<add verb="PUT" allowed="true" />
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="DELETE" allowed="true" />
</verbs>
<fileExtensions>
<add fileExtension=".svc" allowed="true" />
</fileExtensions>
</requestFiltering>
</security>
</system.webServer>
</configuration>
我還在IIS 7中檢查了* .svc的處理程序映射,並檢查了“所有動詞”是否已啟用。
檢查是否允許IIS中有關.svc的相關處理程序處理HTTP POST,PUT,DELETE。 如果僅PUT和DELETE出現問題,請檢查是否未為WebDAV配置虛擬目錄(我認為這是某些HTTP模塊)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.