簡體   English   中英

通過WCF Rest Starter Kit HttpClient應用於PUT時,如何解決WCF Rest MethodNotFound(405)錯誤

[英]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);

這表明...

  • Web服務正確托管在IIS中
  • 我能夠使用SOAP客戶端代理生成的代碼使用服務
  • 我可以通過更友好的HttpClient / rest工具包使用GET請求
  • 我已經在瀏覽器中測試了它並且可以正常工作
  • 由於某些原因,放置和其他相關方法(發布,刪除等)無法通​​過rest工具箱使用

不知道是什么原因造成的。

編輯

我還注意到,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM