0

我正在尝试创建 WCF Restful 服务。

这是我的合同:(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 本机工具命令提示符”进行测试,如下所示:

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

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

对此有什么想法吗?

--> 当前本地使用

--> IIS Express (Visual Studio 2012)

4

2 回答 2

3

您正在使用 svcutil 为“RESTful WCF 服务”创建代理。这不起作用。快速的原因是 Web 端点不公开元数据,以便 svcutil 工具知道它需要向它发送什么请求。长版本在链接的博客文章中。

于 2013-05-06T15:41:15.627 回答
0

问题是 ActivateUser 类的基类 (BaseResult) --> BaseResult

似乎不可能扩展 DataContract 类并期望它能够工作。

现在我使用接口而不是基类

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


[DataContract]
public class ActivateUserResult : IResult {

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

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

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

于 2013-05-06T21:31:49.903 回答