首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决WCF Rest MethodNotFound (405)在附加到WCF Rest启动器包HttpClient时的错误

如何解决WCF Rest MethodNotFound (405)在附加到WCF Rest启动器包HttpClient时的错误
EN

Stack Overflow用户
提问于 2010-09-02 06:49:14
回答 1查看 3.8K关注 0票数 2

我在这里查看了几乎每一个WCF Rest、PUT/POST问题,并且仍然无法确定为什么我无法将其放入或发布到我的web服务中,但能够通过GET调用测试GetTime方法。

此特定服务交换自定义凭据信息(用户名、密码和其他信息)作为令牌。对此令牌信息进行加密,并将其添加到其他web服务的后续请求头中,这样用户名/密码就不必到处传递。

所有web服务调用仍然被视为无状态调用,但访问安全的服务操作需要这些头信息,而不是用户名/密码。

合同

代码语言:javascript
复制
[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();
}

服务驱动

代码语言:javascript
复制
public class UserService : IUserService
{
    #region UserService Members
    public AuthToken PutSession(string username, CustomCredential credential)
    {
      // ...
    }

    public DateTime GetTime()
    {
        return DateTime.Now;
    }
}

测试代码

代码语言:javascript
复制
    [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可以工作(只是我添加的一个测试方法)。

代码语言:javascript
复制
    [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端点,创建了一个新的控制台应用程序,并向该服务添加了一个“服务引用”。使用生成的客户端代理代码,我能够实现类似于.

代码语言:javascript
复制
IUserServiceClient client = new IUserServiceClient();
CustomCredential cred = ...
AuthToken token = client.PutSession("test_username", cred);

这意味着..。

  • web服务在IIS中托管正确的
  • 我可以使用SOAP客户端代理生成的代码
  • 来使用GET请求,我可以通过更友好的HttpClient / rest工具包
  • 来使用get请求,我已经在浏览器中测试了这个get,并且由于某种原因,put和其他相关方法(post、delete )测试了这个get,它的工作原理是H 122>。)不通过rest工具包

工作

不知道是什么导致了这一次。

编辑

我还注意到,IIS一定是在承载服务的网站的根部创建了这个web.config,这似乎允许使用主HTTP谓词。

代码语言:javascript
复制
<?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的处理程序映射,并检查“所有谓词”是否启用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-02 07:27:57

检查IIS中的.svc相关处理程序是否允许处理HTTP、PUT、DELETE。如果只有PUT和DELETE出现问题,请检查您的虚拟目录是否配置为WebDAV (我认为是某些HTTP模块)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3624397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档