C# 調用WCF服務的兩種方法

項目簡介

以前領導佈置一個作單點登陸的功能給我,實際上就是醫院想作一個統一的平臺來實如今這個統一的平臺登陸後不須要在His、Emr、Lis等系統一個個登陸,直接能夠登陸到對應的系統,而後進行相應的操做,方便醫護人員的平常操做。具體到咱們His開發商來講就是實現一個登陸是調用第三方WCF接口獲取第三方登陸用戶在His登陸的用戶名、密碼後續可能還會包括CA信息。html

以前有本身寫過WCF服務給第三方調用,調用過第三方Http服務,尚未寫過調用WCF服務的任務。本身寫過WCF服務的經驗加上網上查閱的資料,分別使用兩種方法來實現C#調用WCF服務:一、直接添加服務引用;二、使用Vs 自帶 SvcUtil工具生成服務代理類。使用的編輯器是VS2008,不一樣版本以前存在差別。json

直接添加服務引用

第一步、在解決方案項目右鍵,選擇添加服務引用。app

第二步、書寫須要實現的功能,針對這個項目就是調用服務的方法,按要求傳入Json格式參數獲取並解析返回的Json格式出參,而後利用出參去實現本身須要實現的功能。編輯器

完成上一步之後,就能夠開始書寫代碼來實現本身須要實現的功能了,實際上添加服務引用的使用,VS會自動替你在添加服務引用的解決方案項目對應的配置文件app.config添加服務綁定、終結點等配置信息。若是你在添加服務引用的項目下面書寫實現功能部分的代碼,則不須要管配置文件,若是你的啓動項目不是添加服務引用的項目,那麼你須要在啓動項目的配置文件部分增長VS編輯器自動添加的配置文件內容,我把自動生成部分的內容展現給你們看看,由於這是我實際開發環境下引用的項目,因此我會對路徑部分進行處理,端口號是可選的,有的服務使用的默認端口號。針對服務綁定、終結點能夠參考博客:https://blog.csdn.net/zhang_xinxiu/article/details/41329511 工具

 

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ISSOService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://路徑[:端口號]/SSOService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISSOService"
                contract="SSOService.ISSOService" name="BasicHttpBinding_ISSOService" />
        </client>
    </system.serviceModel>

 

public class SingleSignOnParam
    {
        public static SingleSignOnOut GetSingleSignOnOut()
        {
            //實例化服務客戶端對象
            SSOServiceClient client = new SSOServiceClient();
            //Json序列化對象實例
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            //獲取機器Mac地址
            string StrMac = DbTool.GetMac();
            //構建入參對象
            SingleSignOnIn singleSignIn = new SingleSignOnIn() { appid = "34", keyword = StrMac.Replace("-","") };
            string jsonStr = string.Empty;
            //序列化獲得Json格式入參字符串
            jsonStr = serializer.Serialize(singleSignIn);
            //調用服務方法獲得出參字符串
            string StrOut = client.GetDataExchange(jsonStr);
            try
            {
                //解析出參字符串獲得實例
                JsonOutPara para = serializer.Deserialize<JsonOutPara>(StrOut);
                if(para.Code=="1")
                    //須要使用的信息存儲在JsonOutPara對象的Result字段中,對字段內的Json格式字符串再次進行解析
                    return serializer.Deserialize<SingleSignOnOut>(para.Result); 
            }
            catch (Exception)
            {
                
                throw;
            }
            return null;
        }
    }
    public class SingleSignOnIn
    {
        public string appid { get; set; }
        public string keyword { get; set; }
    }
    public class JsonOutPara
    {
        public string Code { get; set; }
        public string Message { get; set; }
        public string Result { get; set; }
    }
    public class SingleSignOnOut
    {
        public string menuid { get; set; }
        public string menuname { get; set; }
        public string appid { get; set; }
        public string appname { get; set; }
        public string apptype { get; set; }
    }

 我對代碼進行了簡單的註釋,不明白的地方能夠回覆我,而後進行溝通。這裏面主要是入參和出參都是Json格式的字符串,我這裏使用.Net自帶的System.Web.Extensions程序集,在使用時需先在項目上添加引用而後在代碼前面添加命名空間,代碼以下:using System.Web.Script.Serialization;對於Json轉換爲對象詳細能夠參考博客園文章 http://www.javashuo.com/article/p-aqqbppjg-kg.html,文章中還給出一個轉換Json字符串給C#類的工具,我以爲很是棒。測試

生成代理類

生成代理類的方式相對於第一種方式具備必定的優點:不須要添加服務引用,可是配置文件的內容仍是須要添加的,但一旦服務有所更新,就必須從新生成新的代理類並進行替換,我這裏使用Vs2008自帶的SvcUtil工具,啓動程序後輸入命令: svcutil.exe http://路徑[:端口]/SSOService.svc?wsdl ui

接下來在對應的目錄下面找到代理類文件和配置文件,將配置文件的內容粘貼到實際啓動的項目的配置文件中。我在單獨一個程序裏面進行了該方法的測試,實際效果跟直接添加服務引用一致。打開支付寶首頁搜索「524252978」,便可領紅包。url

 參考資料:

http://www.javashuo.com/article/p-unvxvutm-gb.htmlspa

http://www.javashuo.com/article/p-aqqbppjg-kg.html.net

相關文章
相關標籤/搜索