WCF Restful Service

对 Web Services、WCF 和 Restful 的扫盲可参见:https://www.cnblogs.com/scy251147/p/3382436.html

关于之前对 WCF 的学习,可参见:WCF | wjcx_sqh

首先,对 Restful Service 作简单的了解

  • 创建分布式超文本媒体的一种架构方式
  • 独立于任何技术、平台,面向资源 Resource-Oriented Architecture (ROA)
  • 通过标准的HTTP(GET,POST,PUT,DELETE)操作来定义资源
  • 通过 Uniform Resource Identifier(URI)发布资源

首先,定义服务,简单之

[ServiceContract(Name = "user")]
public interface IServiceWCF
{
	[OperationContract]
	[WebInvoke(Method = "GET", 
		UriTemplate = "getUser/{name}", 
		RequestFormat = WebMessageFormat.Json, 
		ResponseFormat = WebMessageFormat.Json)]
	UserData GetUserData(string name);
}

[AspNetCompatibilityRequirements(
	RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ServiceWCF : IServiceWCF
{
	public UserData GetUserData(string name) {
	  //服务接口方法实现
	}
}

其中,AspNetCompatibilityRequirements 指示该服务能否在 ASP.NET 兼容模式下运行,也可以加上

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

用于指示说明服务端只会存在这类的一个实例。服务定义完成后,需要更新配置文件 Web.Config

<system.serviceModel>
  <services>
    <service name="RestfulWcf.ServiceWCF" behaviorConfiguration="defaultServiceBehavior">
      <endpoint address="" binding="webHttpBinding" contract="RestfulWcf.IServiceWCF"
                behaviorConfiguration="defaultEndpointBehavior"></endpoint>
    </service>
  </services>
    
  <behaviors>
    <serviceBehaviors>
      <behavior name="defaultServiceBehavior">
        <serviceMetadata httpGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="false"/>
      </behavior>
      <behavior name="defaultServiceBehaviorHttps">
        <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
        <serviceDebug includeExceptionDetailInFaults="false"/>
      </behavior>
    </serviceBehaviors>
      
    <endpointBehaviors>
      <behavior name="defaultEndpointBehavior">
        <webHttp helpEnabled="true" automaticFormatSelectionEnabled="true" />
        <dataContractSerializer maxItemsInObjectGraph="6553500"/>
      </behavior>
    </endpointBehaviors>
  </behaviors>
    
  <protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
  </protocolMapping>
    
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />    
</system.serviceModel>

同时,新增 Global.asax 全局资源文件,用于定义注册路由

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        RegistrRoutes();
    }

    private void RegistrRoutes()
    {
        //ServiceRoute需要显式引用 System.ServiceModel.Activation.dll
        RouteTable.Routes.Add(
            new ServiceRoute("user", new WebServiceHostFactory(), typeof(ServiceWCF)));
    }
}

最后,可 Service.svc直接右键运行,也可部署至 IIS

项目-属性,生成路径应为bin目录,IIS部署时,网站路径指向该路径即可

通过该路径可以查看该服务接口发布的方法

http://localhost:18800/user/help

若在调用PUT或DELETE方法时出现 Status:405 Method Not Allowed 问题,在 web.config中 system.webServer节点添加如下配置 

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule" />
</modules>
<handlers>
  <remove name="WebDAV" />
</handlers>

详细配置过程,参见(推荐): WCF RESTFul 服务搭建

参考

关于如何配置 https 的访问参见:http://www.cnblogs.com/mingmingruyuedlut/p/4236035.html

需要分别在 serviceModel和 services中添加 https配置

<bindings>
  <webHttpBinding >
    <binding name="SecureWebBinding" >
      <security mode="Transport">
        <transport clientCredentialType="None"></transport>
      </security>
    </binding>
  </webHttpBinding>
</bindings>

<endpoint address="" binding="webHttpBinding"
          bindingConfiguration="SecureWebBinding"
          contract="RestfulWcf.IServiceWCF"
          behaviorConfiguration="defaultEndpointBehavior"/>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>

不要忘记在 IIS中为该服务绑定 443端口即可。

Restful WCF Service 已经是过时的技术,推荐进一步学习 WebApi,具体参见:C# - MVC WebApi | wjcx_sqh

 

posted @ 2019-06-26 21:20  万箭穿心,习惯就好。  阅读(320)  评论(0编辑  收藏  举报