WCF REST调用返回“Method not allowed”异常

时间:2013-05-06 13:35:16

标签: c# wcf rest exception

我正在尝试创建一个WCF Restful Service。

这是我的合同:( ActivateUser类扩展了BaseResult类)。

namespace SmartShopServerContract {
[ServiceContract]
public interface IService {
    [OperationContract]
    [WebGet(RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json, UriTemplate="au/{eMail}/{password}/{idHandy}")]
    ActivateUserResult ActivateUser(string eMail, string password, string idHandy);
}

// Basisklasse der Resultate --> alle Resultate haben einen definierten Status!
[DataContract]
public abstract class BaseResult {

    private string status;

    public BaseResult(string status) {
        this.status = status;   
    }

    [DataMember]
    public string Status {
        get { return this.status; } 
    }
}

// Result für ActivateUser
[DataContract]
public class ActivateUserResult : BaseResult {
    public ActivateUserResult(string status)
        : base(status) {
    }

    [DataMember]
    public string CryptedPassword { get; set; }
}

}

以下是服务的实施:

namespace SmartShopServerService {
public class ServiceSmartShop : IService {

    public ActivateUserResult ActivateUser(string eMail, string password, string idHandy) {
        return new ActivateUserResult("OK") {
            CryptedPassword="testatsa"
        };
    }

还有Web.config文件:

    <?xml version="1.0"?>
<configuration>
  <system.serviceModel>
     <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint helpEnabled="true" automaticFormatSelectionEnabled="false" defaultOutgoingResponseFormat="Json">
        </standardEndpoint>
      </webHttpEndpoint>
    </standardEndpoints>
    <services>
      <service name="SmartShopServerService.ServiceSmartShop" behaviorConfiguration="RESTBehavior">
        <endpoint address="/" binding="webHttpBinding" contract="SmartShopServerContract.IService" behaviorConfiguration="SmartShopBehavior"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="RESTBehavior">
          <serviceMetadata httpGetEnabled="true" policyVersion="Policy15"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="SmartShopBehavior">
          <webHttp automaticFormatSelectionEnabled="false"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.5" sku=".NETFramework,Version=v4.5"/>
  </startup>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
  </system.webServer>
</configuration>

我正在使用“VS2012本机工具commant提示符”进行测试,如下所示:

svcutil.exe http://localhost:51162/SmartShopService.svc/au/data1/data2/data3

代码正在执行,但我仍然得到Method not allowed(405)异常。

对此有何看法?

- &GT;目前在当地使用

- &GT; IIS Express(Visual Studio 2012)

2 个答案:

答案 0 :(得分:3)

您正在使用svcutil为“RESTful WCF服务”创建代理。 This does not work。原因很简单,Web端点不会公开svcutil工具的元数据,以了解需要向其发送的请求。长版本在链接的博客文章中。

答案 1 :(得分:0)

问题是ActivateUser类的基类(BaseResult) - &gt; BaseResult

似乎无法扩展DataContract类并期望它能够工作。

现在我使用的是Interface而不是基类

public interface IResult {
    string Status{get;set;}
}


[DataContract]
public class ActivateUserResult : IResult {

    [DataMember]
    public string CryptedPassword { get; set; }

    [DataMember]
    public string Status { get; set; }
}

这是有效的....这就是我所知道的;)