WCF服務發布到IIS中去(VS2013+win7系統)


第一個WCF程序

  1. 新建立空白解決方案,並在解決方案中新建項目,項目類型為:WCF服務應用程序。建立完成后如下圖所示:

wcf

  2.刪除系統生成的兩個文件IService1.cs與Service1.svc。

  3.添加自定義的WCF【服務文件】User.svc,此時vs2010會自動生成WCF接口文件IUser.cs,我們在IUser中定義WCF方法ShowName,在User.svc.cs對該接口的方法進行實現。 

     代碼如下:

using System.ServiceModel;

namespace WCFService
{
    [ServiceContract]
    public interface IUser
    {
        [OperationContract]
        string ShowName(string name);
    }
}


namespace WCFService
{
    public class User : IUser
    {
        public string ShowName(string name)
        {
            string wcfName = string.Format("WCF服務,顯示姓名:{0}", name);
            return wcfName;
        }
    }
}

大家可以看到,在WCF中的接口與普通接口的區別只在於兩個上下文,其他的和我們正常學習的接口一樣。定義這個上下文要添加System.ServiceModel的引用。

[ServiceContract],來說明接口是一個WCF的接口,如果不加的話,將不能被外部調用。

[OperationContract],來說明該方法是一個WCF接口的方法,不加的話同上。 

此時我們的第一個WCF服務程序就建立好了,將User.svc“設為起始頁”,然后F5運行一下試試,如下圖所示,VS2010自動調用了WCF的客戶端測試工具以便我們測試程序:

  我們雙擊上圖中的 ShowName() 方法,出現如下圖:

  在請求窗口中的值中輸入參數“你的姓名”,然后點擊“調用”,在響應窗口中會出現返回值“WCF服務,顯示姓名:你的姓名”,說明測試成功,點擊下面的XML也可以看到XML的數據傳輸。我們現在建立好了服務的應用程序和業務邏輯,即非常簡單的打印姓名的方法,測試也成功了。那么我們怎么用呢?

目前來說我們是在wcf測試工具上可以正常調用wcf了,而我們現在想要把它發布到iis上,所以下面就是對iis的配置了。

 

 

 

 

 

第一步:檢查Windows7中IIS是否安裝了必要的組件

方法:控制面板->程序和功能->打開或關閉Windows功能

以下圖片中標注的功能Windows7默認不會安裝的

 

第二步:檢查IIS的配置

系統必備安裝完成后打開IIS服務管理器,點默認網站,雙擊“處理程序映射”如下圖

 檢查一下下圖中紅色標注部分是否已經存在,否則WCF服務是無法調用的。不幸如果沒有找到這幾個"兄弟"的話方法如下

安裝注冊WCF組件

 

1、運行cmd命令行工具。(開始 ==> 運行 ==> cmd回車)
(注意!!如果使用Windows Vista或7的話,務必使用administrator管理員身份運行,否則可能導致下面的操作無法繼續!)

2、進入WCF文件夾:
cd C:\WINDOWS\Microsoft.NET\Framework\v3
.0\Windows Communication Foundation

3、運行ServiceModelReg.exe工具,會得到如下幫助信息:
=================
C:\Documents and Settings\Administrator>cd c:\WINDOWS\Microsoft.NET\Framework\v3
.0\Windows Communication Foundation

C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Communication Foundation>Service
ModelReg
Microsoft(R) Windows Communication Foundation 安裝實用程序
[Microsoft (R) Windows (R) Communication Foundation, 版本 3.0.4506.2152]
版權所有 (c) Microsoft Corporation。保留所有權利。

管理一台計算機上的 Windows Communication Foundation
的安裝和卸載的管理實用程序

用法:
   ServiceModelReg.exe [-i[r | ru] | -u | -ua | -r | -s:<path> | -sn:<path>
   | -k:<path> | -kn:<path> | -lv | -lk | -vi] [-y] [-x] [-q | -v] [-nologo]
   [-?]
-i         - 安裝此版本的 Windows Communication Foundation,並更新
             IIS 元數據庫根處的腳本映射和根以下的所有腳本映射。
             現有的較低版本的腳本映射會升級至此版本。

-ir        - 安裝此版本的 Windows Communication Foundation,
             僅注冊。不要在 IIS 中安裝 Windows Communication Foundation
             腳本映射。
-iru       - 安裝此版本的 Windows Communication Foundation。如果
             存在使用 Windows Communication Foundation 的任何現有
             應用程序,不要在 IIS 中更新它們的腳本映射。
-u         - 卸載此版本的 Windows Communication Foundation。
             將此版本現有腳本映射會重新映射到計算機上剩余的
             已安裝的最高版本的 Windows Communication Foundation。

-ua        - 卸載計算機上所有版本的 Windows Communication Foundation。

-r         - 重新安裝此版本的 Windows Communication Foundation,
             並更新 IIS 元數據庫根處的腳本映射和根以下的所有
             腳本映射。無論原始版本是什么,都將現有的腳本映射
             升級到此版本。
-x         - 包含作為該安裝操作一部分的 Windows Communication
             Foundation 自定義操作腳本。
-s:<path> - 在指定的路徑以非遞歸方式安裝此版本
             的 Windows Communication Foundation。
             例如,ServiceModelReg.exe -s:W3SVC/1/ROOT/SampleApp1
-sn:<path> - 在指定的路徑以非遞歸方式安裝
             此版本的 Windows Communication Foundation。
-k:<path> - 從指定的路徑中以遞歸方式刪除所有版本的 Windows
             Communication Foundation 的所有腳本映射。
             例如,ServiceModelReg.exe -k:W3SVC/1/ROOT/SampleApp1
-kn:<path> - 從指定的路徑中以非遞歸方式刪除 Windows Communication
             Foundation 的所有版本的所有腳本映射。
-lv        - 列出在該計算機上安裝的所有版本的 Windows Communication
             Foundation,以及狀態和安裝路徑。
-lk        - 列出對 Windows Communication Foundation 進行腳本映射
             的位置的所有 IIS 元數據庫密鑰,以及該版本。將不會
             顯示從父密鑰繼承 Windows Communication Foundation
             腳本映射的密鑰。
-vi        - 確認目標組件的安裝並生成報告。組件可以處於下列狀態:
              未知、未安裝、已進行默認安裝或已進行自定義安裝。

-y         - 在卸載或重新安裝組件之前不要求確認。

-q         - 安靜模式(減少輸出信息)。
-v         - 詳細模式。
-nologo    - 取消版權和標題消息。
-?         - 打印此幫助文本。
=================
4、注冊WCF組件,執行:ServiceModelReg.exe -i 回車

如果出現下面的信息,說明注冊成功了:
=================
C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Communication Foundation>Service
ModelReg -i
Microsoft(R) Windows Communication Foundation 安裝實用程序
[Microsoft (R) Windows (R) Communication Foundation, 版本 3.0.4506.2152]
版權所有 (c) Microsoft Corporation。保留所有權利。


正在安裝: Machine.config 節組和處理程序

正在安裝: System.Web 生成提供程序

正在安裝: System.Web 編譯程序集

正在安裝: HTTP 處理程序

正在安裝: HTTP 模塊

正在安裝: Web 主機腳本映射

 

安裝完成后打開IIS

 

 

在網站上右鍵,選擇添加網站,在物理路徑輸入wcfservice項目的路徑,然后隨便指定一個網站名稱即可。

 

 

然后在我們自己的wcf項目上右鍵,點擊添加虛擬目錄,選擇到wcf項目的路徑,然后隨便取一個別名,添加后如圖所示。

 

點擊虛擬目錄,然后右鍵選擇 轉換為應用程序,如圖所示

 

 

啟動網站,在右邊的Service1.svc,右鍵選擇瀏覽即可

IIS最終配置圖片是這樣,可以看到網站已經添加進來了,並且加入了虛擬目錄(最下面的test目錄),虛擬目錄也轉換為了應用程序(變成了瀏覽器的圖標)

 

如果配置正確的話,可以看到如下界面,此時我們就已經把webservice發布到iis上了

 

當然,我不是用創建虛擬目錄這種方式發布的。vs2013用的是.net4.5的語言版本,采用本地發布,然后通過iis附加網站的形式,結果出現了一堆錯誤。

1.無法激活服務,WCF設置ASP.NET 兼容性

錯誤提示:無法激活服務,因為它不支持 ASP.NET 兼容性。已為此應用程序啟用了 ASP.NET 兼容性。請在 web.config 中關閉 ASP.NET 兼容性模式或將 AspNetCompatibilityRequirements 屬性添加到服務類型且同時將 RequirementsMode 設置為“Allowed”或“Required”。

解決辦法:

修改相應   服務.svc.cs

using System.ServiceModel.Activation ;

[AspNetCompatibilityRequirements (RequirementsMode=AspNetCompatibilityRequirementsMode.Required)]

 
 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class CalculatorService : ICalculatorSession
{
  ...
}
 
web.config中
 </services>
    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
      <baseAddressPrefixFilters>
        ...
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    
    <behaviors>

2.未能加載文件或程序集“xxx”或它的某一個依賴項。生成此程序集的運行時比當前加載的運行時新,無法加載此程序集  

1、主要原因是:引用的項目 .net 版本與啟動的框架不同

windows xp
我的電腦->右鍵管理->Internet信息服務->默認網站->右鍵屬性->ASP.NET->> 更改相應的asp.net版本即可
windows 7
我的電腦->右鍵管理->Internet信息服務(IIS)管理器->雙擊打開->單擊應用程序池->雙擊要修改的網站->將.NET Framework 版本修改為相對應的版本即可
2、調試wcf服務時
iis程序池 net framwork 版本和自己項目的net framwork版本不一致造成的,修改iis程序池配置,調試ok。
3、調整中會出現“ 未能加載文件或程序集 或它的某一個依賴項,拒絕訪問

方法一、停止Indexing   service服務   
 方法二:配置ASP.net   的臨時目錄不受Indexing   service服務的影響   
 方法三:刪掉bin目錄下的pdb文件   
方法四:修改windows/temp目錄權限,設asp.net   Machine   Account為對這個目錄的完全控制權限
等,但都不能解決問題。

原因是對asp.net對臨時文件夾沒有讀寫權限造成的,對C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files目錄授權就可以徹底解決問題,到目前為止還沒有遇到不能解決的,但前提是文件確實存在,不缺少文件。

 

4、刪除掉並重新加載dll文件,並確保dll文件已經引用到bin文件夾中;

5、賦予C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files讀寫權限。

整理了上面幾個方法僅供參考,經過一番折騰我發現是我的Web.config中的版本問題,因為我的本地的編寫軟件使用了最新的是VS2010編寫的版本4.0而我的服務器空間的是V3.5的,所以我采用了第四中方法把原來的dll文件刪除,上傳最新的之后就可以運行。

3.處理程序“PageHandlerFactory-Integrated”在其模塊列表中有一個錯誤模塊“ManagedPipelineHandler”

 

原因:

vs2010默認的是4.0框架,4.0的框架是獨立的CLR,和2.0的不同,如果想運行4.0的網站,需要用aspnet_regiis注冊4.0框架,然后用4.0的Class池,就可以運行4.0的web項目了.

如何用aspnet_regiis注冊4.0框架 :

方法如下,啟動cmd (win鍵+R 啟動cmd)  ,找到 4.0所在的目錄,本人機器目錄是 ;

注意:要以管理員的身份運行DOS窗口。

復制目錄  C:\Windows\Microsoft.NET\Framework\v4.0.30319

運行  aspnet_regiis.exe -i

安裝完成,這時的IIS就可以運行 .net 4.0 部署的網站了.

 

可以正常運行的wcf項目的配置文件如下:

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="connStr" connectionString="server=10.1.0.17;database=wupublic;uid=slpgdm;pwd=slpgdata@123.com"/>
    <add name="conString" connectionString="server=10.1.0.17;database=BankLoan;uid=slpgdm;pwd=slpgdata@123.com"/>
  </connectionStrings>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
  </appSettings>
  <system.web>
    <!--<compilation debug="true" targetFramework="4.5" />-->
    <!--<httpRuntime targetFramework="4.5"/>-->
    <compilation debug="true"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <!--<behavior>
          -->
        <!-- 為避免泄漏元數據信息,請在部署前將以下值設置為 false -->
        <!--
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          -->
        <!-- 要接收故障異常詳細信息以進行調試,請將以下值設置為 true。在部署前設置為 false 以避免泄漏異常信息 -->
        <!--
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>-->
        <behavior name="MyBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!--<protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>-->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <services>
      <service behaviorConfiguration="MyBehavior" name="WcfService.Service1">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="NewBinding0" contract="WcfService.IService1"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <bindings>
      <basicHttpBinding>
        <binding name="NewBinding0" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <security mode="None"/>
        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        若要在調試過程中瀏覽 Web 應用程序根目錄,請將下面的值設置為 True。
        在部署之前將該值設置為 False 可避免泄露 Web 應用程序文件夾信息。
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

 

IIS網站本機可以訪問,局域網其他機器無法訪問的問題:

在部署網站到服務器的時候,發現本地訪問網站沒問題,但是局域網其他機器無法訪問,或者在把相應端口映射后,外網也無法訪問初步解決方案——防火牆規則

開始】打開【控制面板】,選擇【WINDOWS 防火牆】,進入

在防火牆界面,選擇左側邊欄的【高級設置】

在彈出的高級安全Windows防火牆界面中,選擇左側邊欄的【入站規則】,然后在右側邊欄選擇【新建規則】

在彈出的窗口中完成如下操作:

1.選擇【端口】,下一步;

2.選擇【TCP】以及【特定本地端口】,填入要開放的端口號(或開放所有端口,可以以逗號分隔多個端口),下一步;

3.【允許連接】,下一步;

4. 網絡類型全部勾選,下一步;

5.【名稱】中填入自定義名稱,如:IIS 【完成】。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM