Chr☆s Kwok 的技术笔记

.NET, C#, WPF, WCF, WF, .NetCore & LINQ ... I know how it works because I know why it works ...

博客园 首页 新随笔 订阅 管理

我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以依靠IIS来管理宿主进程的生命周期。在开发和使用的过程与Web Service非常相似。

1) 为WCF服务创建.svc文件

       对于ASP.NET Web Service的每个服务都具有一个.asmx文件,客户端通过访问.asmx文件实现对相应Web Service的调用。WCF服务与Web Service类似,每个WCF服务也具有一个对应的文 件,其文件扩展名为.svc。基于IIS的服务寄宿要求相应的WCF服务具有相应的.svc文件,.svc文件部署于IIS站点中,对WCF服务的调用体现在对.svc文件的访问上。

       .svc文件的内容很简单,仅仅包含一个ServiceHost指令(Directive),该指令具有一个必须的Service属性和一些可选的 属性。所以最简单的.svc仅仅具有一个包含Service属性(该属性指明了相应的WCF服务的有效类型)的ServiceHost指令。 BookService对应的.svc如下所示,我们把该.svc放在Services项目的根目录下,并将文件命名为 BookService.svc。
         <%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLib.BookService" %>

2) 为WCF创建web.config文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="true" />
    </system.webServer>
         <system.serviceModel>
    <services>
      <service name="WcfServiceLib.BookService">
        <endpoint address="" binding="basicHttpBinding" contract="WcfServiceLib.IBookService">
        </endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 为避免泄漏元数据信息,
          请在部署前将以下值设置为 false -->
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" />
          <!-- 要接收故障异常详细信息以进行调试,
          请将以下值设置为 true。在部署前设置为 false
          以避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
    <system.web>
        <compilation defaultLanguage="c#" />
    </system.web>
</configuration>

3) 将上述文件和程序集放到相应目录下

        创建一个文件夹,将上述文件和程序集放到想应目录下。这里,创建文件夹‘WCF’,将文件‘BookService.svc’,‘Web.config’放入。
因为一个Web应用在运行的时候会默认从位于根目录下的Bin目录加载程序集,所以,程序集‘WcfServiceLib.dll’放入子目录‘bin'下,如下图。

4) 为WCF服务创建WebSite

1. 在IIS 7.5中,在”Default Web Site”上右键弹出快捷菜单,点击“添加应用程序…”。


2. 在“添加应用程序”对话框中,分别在“别名”、“物理路径”文本框中输入内容,同时点击“选择”按钮,在弹出的“选择应用程序池”中选择“ASP.NET v4.0”。


3. 创建完成之后的结果,如下图。


4. 浏览BookService.svc页面。如下图。


5. 最后结果,如下图。

5). 它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供。

解决方案: 打开.svc文件,你会看到<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLib.BookService" %> 注意红色字体要与WCF提供的类一致


********* HIS30 宿主IIS过程中的错误解决方法 *********
1. HTTP 错误 404.3 - Not Found由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。如下图。

解决方案:

确保已安装IIS7的激活组件
  在应用WAS宿主时,必须确保IIS7的激活组件安装好。打开“控制面板”-->“打开或关闭Windows功能”-->对话框“Windows功能”中查看
1、Internet Information Services的万维网服务->"常见功能"的 HTTP错误 和 静态内容 是否都勾选;
2、“Microsoft .NET Framework 3.5.1”中的“WCF的HTTP激活”与“WCF的非HTTP激活”。如果没安装,请安装。如下图所示:


2.  未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型 “System.ServiceModel.Activation.HttpModule”。说明执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息System.TypeLoadException: 未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型 “System.ServiceModel.Activation.HttpModule”。如下图

解决方案: 在CMD命令窗口中执行以下指令。 aspnet_regiis.exe -i。如下图

3.“/CoreService”应用程序中的服务器错误。

Schema specified is not valid. Errors:
JetSun.DataModel.Cis.Oracle.EdmActSite.ssdl(2,2) : error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'Oracle.ManagedDataAccess.Client'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.

或者

找不到请求的 .Net Framework Data Provider。 可能没有安装。

解决方案:
首先, 安装oracle驱动ODAC
(1)Oracle客户端安装(可选)或者安装InstantClient版本(基础支持版,参见表格内容)

Oracle—在不安装oracle客户端的情况下,使用PL/SQL Developer 14
一般在使用plsql时,会结合oracle客户端来使用,这样方便把数据库连接信息添加到plsql中。不过oracle客户端软件有点庞大,安装起来不太方便,所以使用下面方法不依赖oracle客户端来使用plsql。
1、准备
虽然不用oracle客户端,但是也要用到一个工具包--instantclient,可以到oracle官网下载(视具体操作系统版本下载对应文件):
2、下载完毕文件名为instantclient-basic-windows.x64-21.6.0.0.0dbru.zip
3、解压到你自己指定的路径(如C:\Users\11513\Oracle),那么主目录就是 C:\Users\11513\Oracle\instantclient_21_6
4、创在C:\Users\11513\Oracle\instantclient_21_6\network\admin路径下创建文件tnsnames.ora,内容如下:
# tnsnames.ora Network Configuration File: f:\app\guoshaoyue\product\11.2.0\client_1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
 
ZSYKTEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.133.194)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ZSYKTEST)
)
)
5、配置PL/SQL
依次打开“tools--preferences--connection”,配置:
Oracle Home(Oracle主目录):C:\Users\11513\Oracle\instantclient_21_6
OCI library(OCI库):C:\Users\11513\Oracle\instantclient_21_6\oci.dll

F:\Setup\Oracle\client\setup.exe,安装成功后可以查看
F:\app\guoshaoyue\product\11.2.0\client_1\network\admin\tnsnames.ora(可根据实际情况修改服务器信息)
# tnsnames.ora Network Configuration File: f:\app\guoshaoyue\product\11.2.0\client_1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.

ORCL242 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.99.242)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ORCL)
    )
  )

ORCL243 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.99.243)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ORCLBAK)
    )
  )
测试:CMD窗口运行SQLPlus.exe(F:\app\guoshaoyue\product\11.2.0\client_1\BIN\sqlplus.exe)使用别名ORCL243和用户登录:
输入用户名(注意需要带上别名RCL243,以@符号为别名前缀):
也可以用户名和密码一起输入(apps/jetsun@orcl243):

(2)连接oracle数据库,要安装64位ORACLE的.net framework驱动
    安装文件F:\Setup\Oracle\ODPManaged_new.zip(解压后有文件:安装.bat)
    查看C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config文件中有oracle provider相关节点,不用手工修改。

注意: 注册表内容64位和32位节点同步
在64位操作系统下,默认注册表根路径为:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JetSun,而64位进程访问的路径为:HKEY_LOCAL_MACHINE\SOFTWARE \JetSun,如果不存在该路径,可将HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JetSun复制过去。

其次、需要存在下面3个文件。Web.config内容需正确

客户端访问策略文件clientaccesspolicy.xml内容:

<?xml version="1.0" encoding="utf-8"?>  
<access-policy>  
  <cross-domain-access>  
  <policy>  
  <allow-from http-request-headers="*">  
  <domain uri="*"/>  
  </allow-from>  
  <grant-to>  
  <resource path="/" include-subpaths="true"/>  
  </grant-to>  
  </policy>  
  </cross-domain-access>  
</access-policy>

跨域文件crossdomain.xml内容:

<?xml version="1.0" ?>
<cross-domain-policy>
  <allow-access-from domain="*" />
</cross-domain-policy>

Web.config的正确内容(WIN10则需要在Application的BIN路径下都存在该web.config文件):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <configSections> 
    <section name="entityFramework"
      type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
      requirePermission="false"/>
    <section name="oracle.manageddataaccess.client"
      type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
  </configSections>

 
    <system.webServer>
        <defaultDocument>
            <files>
                <add value="Default.html" />
            </files>
        </defaultDocument>
    </system.webServer>

<connectionStrings>
</connectionStrings>

  <system.diagnostics >
    <sharedListeners>
      <add name="sharedListener"
           type="System.Diagnostics.XmlWriterTraceListener"
           initializeData="c:/temp/trace.svclog" />
    </sharedListeners>
    <sources>
      <source name="System.ServiceModel" switchValue="Verbose, ActivityTracing" >
        <listeners>
          <add name="sharedListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging" switchValue="Verbose">
        <listeners>
          <add name="sharedListener" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
  


  <oracle.manageddataaccess.client>
    <version number="4.121.2.0">
      <edmMappings>
        <edmMapping dataType="number">
          <add name="bool" precision="1" />
        </edmMapping>
      </edmMappings>
    </version>
  </oracle.manageddataaccess.client>

   <runtime>
      <gcServer enabled="true"/>
   </runtime>

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb"/>
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
      <provider invariantName="Oracle.ManagedDataAccess.Client"
        type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
    </providers>
  </entityFramework>

</configuration> 

4.“HTTP 错误 500.19 - Internal Server Error”应用程序中的服务器错误。

具体报错信息:C:\inetpub\wwwroot\web.config定义了重复的"oracle.manageddataaccess.client"节

这里以Microsoft.NET Framework64位的为例:

报错的原因是:C:\inetpub\wwwroot\web.config定义的"oracle.manageddataaccess.client"节与C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config定义的"oracle.manageddataaccess.client"节重复,并不是本身C:\inetpub\wwwroot\web.config文件定义的"oracle.manageddataaccess.client"节有重复(实际没有重复的)

注意:重点在于C:\inetpub\wwwroot\web.config定义的"oracle.manageddataaccess.client"节的内容和C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config定义的"oracle.manageddataaccess.client"节不一致(这往往是中间层机器安装了不同版本的ORACLE客户端导致的),并非重复,Version与PublicKeyToken完全一致是不会报上述错误的。

posted on 2021-02-20 17:42  Chr☆s  阅读(221)  评论(0编辑  收藏  举报