WPF內嵌WCF服務對外提供介面

来源:https://www.cnblogs.com/GreenShade/archive/2019/05/23/10915023.html
-Advertisement-
Play Games

這是對wpf內嵌wcf的講解文章,也算是為小車的項目進行講解了。 ...


要測試本帖子代碼請記得管理員許可權運行vs。

我寫這個帖子的初衷是在我做surface小車的時候有類似的需求,感覺這個功能還挺有意思的,所以就分享給大家,網上有很多關於wcf的文章 我就不一一列舉了。公司有個舊的項目是winform寫的,裡面就有這個內嵌的wcf,我還沒怎麼搞過wpf,大家都說winform太老了,於是乎我就想用wpf內嵌下試試看看能不能成功。

下麵是我的surface go小車的帖子。

 https://www.cnblogs.com/GreenShade/p/10912738.html

 

這個項目我是參考網上的一個帖子。不過好多網友的貼子或多或少都有幫助,但是有的沒收藏下來。我就貼上一個我覺得是乾貨的帖子吧。

 .https://social.msdn.microsoft.com/forums/silverlight/en-US/d7afa073-e329-43a7-a120-7c59e1a4fd7f/how-to-return-html-page-from-wcf-with-webhttpbinding

首先我們要確保vs裡面安裝了wcf組件。

如圖即安裝了桌面開發,又安裝了wcf的組件就可以開始了。

管理員許可權運行vs,首先新建一個wpf項目,這個大家應該都很熟悉。然後再在項目里添加新建項。

名稱可以根據自己的業務命名。添加完成會在項目引用里多出一些dll文件。也會多出兩個cs文件,那兩個文件就是對外暴露的介面文件了,可以寫一些業務邏輯給別人調用。

 

 ServiceModel就是比較主要的dll,我們用的一些服務都是這裡面的。下麵的ServiceModel.Web是我手動添加的。

同時項目裡面的App.config配置文件會出現Wcf相關的配置。

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service name="WpfWcf.Service1">
                <endpoint address="" binding="basicHttpBinding" contract="WpfWcf.IService1">
                    <identity>
                        <dns value="localhost" />
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8733/Design_Time_Addresses/WpfWcf/Service1/" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>
</configuration>

 我是將system.serviceModel節點的相關東西都刪掉了。然後換成了之前在網上找到的配置方法。大家可以直接拿來使用。主要是把 service name和conract相關的改成自己的項目的就行了。

 <system.serviceModel>
    <services>
      <service name="WpfTestWCF.Service1" behaviorConfiguration="default">
        <endpoint address="" behaviorConfiguration="webHttp" binding="webHttpBinding" bindingConfiguration="general" contract="WpfTestWCF.IService1">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Service1"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="webHttp">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="default">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceThrottling maxConcurrentCalls="256" maxConcurrentSessions="1024" maxConcurrentInstances="1024"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="general" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00" maxReceivedMessageSize="4194304" maxBufferSize="4194304" maxBufferPoolSize="33554432">
          <readerQuotas maxDepth="32" maxArrayLength="16384" maxStringContentLength="16384" maxBytesPerRead="8192" maxNameTableCharCount="65536"/>
          <security mode="None">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>

 此時配置相關的算是已經配置好了。然後我們就需要啟動服務和寫介面了。我們在主視窗放一個button然後搞個點擊事件。

事件里就寫上啟動服務的代碼。

  private void Button_Click(object sender, RoutedEventArgs e)
        {
            ServiceHost host = new ServiceHost(typeof(Service1));          
            host.Open();
        }

  記得關閉的時候釋放下。

下麵是介面相關。我們開始添加wcf服務的時候引入了兩個主要的dll。

下麵是我的介面名稱定製部分。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WpfTestWCF
{
    // 註意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼和配置文件中的介面名“IService1”。
    [ServiceContract]
    public interface IService1
    {
        [OperationContract, WebGet(UriTemplate = "test?name={filename}", ResponseFormat = WebMessageFormat.Json)]
        string DoWork(string filename);
    }
}

  實現就是return filename,就是測試數據。

 

點擊按鈕啟動服務。然後通過瀏覽器調用在app.config里定義好的服務地址,就可以調用到我們介面里的方法了,然後就可以像調用web服務一樣了。

 

項目代碼我就不上傳了。已經講的很詳細了。我已經把代碼整合到我的Surface Go項目里了,下麵是GitHub的地址。

https://github.com/GreenShadeZhang/GreenShade.Net

 



 


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

-Advertisement-
Play Games
更多相關文章
  • 1,函數重寫回顧: 1,父類中被重寫的函數依然會繼承給子類; 2,子類中重寫的函數將覆蓋父類中的函數; 1,重寫父類當中提供的函數是因為父類當中提供的這個函數版本不能滿足我們的需求,因此我們要重寫; 2,期望只要是子類對象,則調用子類當中的版本,而不是父類當中定義的函數版本; 3,通過作用域分辨符( ...
  • 自己動手寫一個鎖需要哪些知識? 自己動手寫一個鎖到底有多簡單? 自己能不能寫出來一個完美的鎖? ...
  • 1,父子間的衝突是由繼承帶來的,兩個類之間存在了繼承的關係,必然的會帶來一 些問題,本文要討論的是父子之間成員變數或成員函數的命名問題; 2,思考: 1,子類中是否可以定義父類中的同名成員? 1,可以,本文先編程解決這個問題; 2,這個問題就是同名覆蓋問題; 2,如果可以,如何區分?如果不可以,為什 ...
  • <!--done--> 文章來源於:https://www.cnblogs.com/chuxiuhong/p/5885073.html Python 正則表達式入門(初級篇) 本文主要為沒有使用正則表達式經驗的新手入門所寫。 轉載請寫明出處 引子 首先說 正則表達式是什麼? 正則表達式,又稱正規表示 ...
  • 賊有意思的一道題。考慮把費用給轉化一下,觀察 如果定義葉節點的狀態 {{A,0},{B,1}},非葉節點的狀態 {{nA =nB,0},{nA define ls (x 1; int key=!(1&(set (dep i))); //相異有貢獻 if(l 1,len=r l+1; lq[dep]= ...
  • [toc] 一. 基礎: hashCode()和equals()簡介 在學習hashCode()和equals()之間的關係之前, 我們有必要先單獨瞭解他倆自身的特點. equals()方法用於比較兩個對象是否相等, 它與"=="相等比較符有著本質的不同. 在萬物皆對象的Java體系中, 系統把判斷 ...
  • 來做一個NLP任務 步驟為: 1.讀取文件; 2.去除所有標點符號和換行符,並把所有大寫變成小寫; 3.合併相同的詞,統計每個詞出現的頻率,並按照詞頻從大到小排序; 4.將結果按行輸出到文件 out.txt。 代碼: import re import os,sys # 你不用太關心這個函數 def ...
  • 1,被忽略的細節: 1,冒號( :)表示繼承關係,Parent 表示被繼承的類,public 的意義是什麼? 2,有趣的問題: 1,是否可以將繼承語句中的 public 換成 protected 或者 private?如果可以,與 public 繼承有什麼區別? 3,有趣的嘗試編程實驗: 1,pro ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...