第一個WCF程序
1. 新建立空白解決方案,並在解決方案中新建項目,項目類型為: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)]
public class CalculatorService : ICalculatorSession
{
</services>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
...
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
<behaviors>
2.未能加載文件或程序集“xxx”或它的某一個依賴項。生成此程序集的運行時比當前加載的運行時新,無法加載此程序集
1、主要原因是:引用的項目 .net 版本與啟動的框架不同
方法一、停止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文件刪除,上傳最新的之后就可以運行。
原因:
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 【完成】。