WCF學習之旅—第三個示例之四(三十)

来源:http://www.cnblogs.com/chillsrc/archive/2016/11/17/6072675.html
-Advertisement-
Play Games

在上一篇文章中我們創建了WCF服務端應用程式,在這一篇文章中我們來學習如何創建WCF的服務端寄宿程式與客戶端調用程式。 ...


       上接WCF學習之旅—第三個示例之一(二十七)

              WCF學習之旅—第三個示例之二(二十八)

             WCF學習之旅—第三個示例之三(二十九)

          在上一篇文章中我們創建了WCF服務端應用程式,在這一篇文章中我們來學習如何創建WCF的服務端寄宿程式與客戶端調用程式。

          關於如何寄宿可以參考以下文章WCF學習之旅—WCF寄宿前的準備(八), WCF學習之旅—WCF服務部署到IIS7.5(九),WCF學習之旅—WCF服務部署到應用程式(十)WCF學習之旅—WCF服務的Windows 服務程式寄宿(十一)WCF學習之旅—WCF服務的WAS寄宿(十二)WCF學習之旅—WCF服務的批量寄宿(十三)

          具體步驟見下麵。

七、創建WCF服務端寄宿程式

  1. WCF服務需要依存一個運行著的進程(宿主),服務寄宿就是為服務指定一個宿主的過程。
  2. 我們在BookMgr.Hosting項目中通過配置方式完成所有的服務寄宿工作,下麵的代碼是通過一個控制台應用對 BookService的寄宿的實現。關於配置方式參見前一文章。
  3. 如果在運行的過程中會出現以下錯誤信息:“在服務“BookService”實現的協定列表中找不到協定名稱“BookMgr.Contracts.IBookService”。則回到BookMgr.Contracts項目中修改介面文件代碼如下。
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
 

namespace BookMgr.Contracts
{

    [ServiceContract]
    public interface IBookService
    {
        [OperationContract]
        string Add(string bookInfo);

        [OperationContract]
        string Edit(string bookInfo);

        [OperationContract]
        string Get(string bookId);

        [OperationContract]
        string Delete(string bookInfo);

        [OperationContract]
        string Search(string Category, string searchString); 

    }
}

 

      4. BookMgr.Hosting 中的App.config配置文件如下:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework,
Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
requirePermission="false" /> </configSections> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> <connectionStrings> <add name="BookEntities" connectionString="metadata=res://*/BookModel.csdl|res://*/BookModel.ssdl|res://*/BookModel.msl;
provider=System.Data.SqlClient;provider connection string=&quot;data source=.\sqlexpress;initial catalog=Test;
integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
providerName="System.Data.EntityClient" /> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> <system.serviceModel> <diagnostics> <messageLogging logEntireMessage="true" logKnownPii="false" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" /> <endToEndTracing propagateActivity="true" activityTracing="true" messageFlowTracing="true" /> </diagnostics> <behaviors> <serviceBehaviors> <behavior name="metadataBehavior"> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8088/BookService/metadata" /> <serviceDebug includeExceptionDetailInFaults="True" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="metadataBehavior" name="BookMgr.Service.BookService"> <endpoint address="http://127.0.0.1:8088/BookService" binding="wsHttpBinding" contract="BookMgr.Contracts.IBookService" /> </service> </services> </system.serviceModel> </configuration>

       5. BookMgr.Hosting中的Program.cs的代碼如下:

 

using BookMgr.Service;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text;
using System.Threading.Tasks;

 

namespace BookMgr.Hosting
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (ServiceHost host = new ServiceHost(typeof(BookService)))

                {
                    host.Opened += delegate
                    {
                        Console.WriteLine("BookService,使用配置文件,按任意鍵終止服務!");

                    };
                    host.Open();
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    foreach (ServiceEndpoint se in host.Description.Endpoints)
                    {
                        Console.WriteLine("[終結點]: {0}\r\n\t[A-地址]: {1} \r\n\t [B-綁定]: {2} \r\n\t [C-協定]: {3}",

                     se.Name, se.Address, se.Binding.Name, se.Contract.Name); 

                    }

                    Console.Read();
                }
            }
            catch (Exception ex)

            {
                Console.WriteLine(ex.Message);

            }
        }
    }
}
 

        在接下來的步驟中,將創建一個 Windows 窗體客戶端應用程式以使用該服務。

八、創建客戶端Windows應用程式

  1. 在菜單欄上,依次選擇“文件-->添加-->新建項目”。
  2. 在“添加新項目”對話框中,展開 “Visual C#”節點,選擇“Windows”節點,然後選擇“Windows 窗體應用程式”。
  3. 在“名稱”文本框中,輸入 BookMgr.Client,然後選擇“確定”按鈕。 如下圖。

        4. 在解決方案資源管理器中,添加一些引用,如下圖。       5. 在菜單欄上,選擇“項目”、“設為啟動項目”。

      6. 在“解決方案資源管理器”視窗中,選中“BookMgr.Client”項目,彈出右鍵菜單,選擇“添加—》新建項”。        7. 在“Windows Forms”節點下,選擇“Windows窗體”,新建一個FrmBook.cs文件。如下圖。       8. 在FrmBook窗體界面中按下圖,進行拖放窗體控制項。

九、添加篩選功能

       在此步驟中,將在應用程式中添加根據書籍的類型篩選書籍數據的功能。

  1. 在解決方案資源管理器中,選中“FrmBook.cs”文件,在彈出的右鍵菜單中選擇“打開”,或者使用滑鼠左鍵雙擊。
  2. 將工具箱中的 Lable 控制項、TextBox控制項和 Button 控制項添加到窗體。
  3. 打開 Button 控制項的快捷菜單,選擇“查看代碼”,然後在 btnSearchCategory_Click事件處理程式中添加以下代碼:
 private void btnSearchCategory_Click(object sender, EventArgs e)
        {
            try
            {
                using (ChannelFactory<IBookService> channelFactory = new ChannelFactory<IBookService>("WSHttpBinding_IBookService"))
                {
                    IBookService proxy = channelFactory.CreateChannel();

                    using (proxy as IDisposable)
                    {
                        textBoxMsg.Text = proxy.Search(txtCategory.Text, string.Empty);
                        List<Books> books = XMLHelper.DeSerializer<List<Books>>(textBoxMsg.Text);
                        gridBooks.DataSource = books;
                    }
                }

            }
            catch (Exception ex)
            {
                textBoxMsg.Text = ex.Message;

            }

        }

 

       4. 在菜單欄上,依次選擇“調試”和“啟動調試”以運行應用程式。

       5.  在紅框中的文本框中,輸入 IBM,然後使用滑鼠點擊“查詢”按鈕。 將僅顯示來自 類型為IBM 的書籍。如下圖。

 

現在,你有了一個可以使用的應用程式,該應用程式將顯示 BookService服務中的書籍列表。 如果希望通過該服務公開其他數據,則可以修改實體數據模型以包括資料庫中的其他表。

 

註:如果在進行這一步驟中的編碼過程中,出現了以下異常錯誤信息:

錯誤信息:

通信對象 System.ServiceModel.Channels.ServiceChannel 無法用於通信,因為其處於“出錯”狀態。

光看上面的錯誤信息無法判斷到底是怎麼回事,進行調試,查看WCF內部暴露的錯誤信息,如下

無法為具有固定名稱“System.Data.SqlClient”的 ADO.NET 提供程式載入在應用程式配置文件中註冊的實體框架提供程式類型“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”。請確保使用限定程式集的名稱且該程式集對運行的應用程式可用。有關詳細信息,請參閱 http://go.microsoft.com/fwlink/?LinkId=260882

 

這個異常,最後我找到出錯的原因是:由於BookMgr.Hosting項目缺少對EntityFramework.SqlServer.dll的引用。

解決方法:為BookMgr.Hosting項目通過nuget添加上EntityFramework包,如下圖一。原來的引用圖如下圖二,添加引用之後,如下圖三。

 

圖1

 

圖2

 

圖3

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • EntityFramework 一對一關係映射有很多種,比如主鍵作為關聯,配置比較簡單,示例代碼: 上面代碼表示 Teacher 和 Student 一對一關係,Fluent API 配置如下: 測試代碼: 生成 SQL 代碼: 另一種 Fluent API 配置如下: 執行同樣測試代碼,生成 SQ ...
  • ...
  • 本文主要涉及兩個概念: 阿裡雲OSS:對象存儲(Object Storage Service,簡稱OSS),是阿裡雲對外提供的海量、安全和高可靠的雲存儲服務。 bootstrap-fileinput:An enhanced HTML 5 file input for Bootstrap 3.x wi ...
  • 刪除重覆的文件功能 使用方法: 建一個BAT文件,如1.bat,裡面寫入:RemoveDuplicate.exe path1 path2 (或者在命令行下輸入以上內容) 其中path1表示原文件夾,path2表示要檢測和刪除的文件夾 例如文件夾path1中有:1.txt、2.txt、3.txt、4. ...
  • 吃飯的時候翻開推特發現巨硬在開大會,真是後知後覺啊。整理了一下幾個大事分享出來: 1.谷歌雲加入了.NET 基金會的一個小組。 2.三星Tizen系統將整合.NET Core平臺,並於2017年正式推出。這個系統目前貌似主要用在三星電視中,原文描述如下: Tizen’s .NET support w... ...
  • 本演練介紹瞭如何使用新資料庫進行 Code First 開發。我們用類定義一個模型,然後使用該模型創建一個資料庫,然後存儲和檢索數據。資料庫創建之後,我們使用 Code First 遷移將架構更改為我們發展後的模型。此外還介紹瞭如何使用數據註釋和 Fluent API 來配置模型。 ...
  • 在IIS中瀏覽某個網站時,出錯案例現場: 編譯器錯誤消息: CS0016: 未能寫入輸出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\41c262f4\874fe77f\App_Web_ ...
  • 首先需要說明的是這是.net framework的一個組件,而不是針對.net core的。目前工作比較忙,因此.net core的轉換正在編寫過程中,有了實現會第一時間貼出來。 接下來進入正題。對於大型的分層系統,會有一個應用程式層,應用程式層的主要作用是封裝業務領域層的業務邏輯層,並對界面展示層 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...