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


來源:https://blog.csdn.net/freelooppowter/article/details/81908849#comments

項目簡介
之前領導布置一個做單點登錄的功能給我,實際上就是醫院想做一個統一的平台來實現在這個統一的平台登錄后不需要在His、Emr、Lis等系統一個個登錄,直接可以登錄到對應的系統,然后進行相應的操作,方便醫護人員的日常操作。具體到我們His開發商來說就是實現一個登錄是調用第三方WCF接口獲取第三方登錄用戶在His登錄的用戶名、密碼后續可能還會包括CA信息。

之前有自己寫過WCF服務給第三方調用,調用過第三方Http服務,還沒有寫過調用WCF服務的任務。自己寫過WCF服務的經驗加上網上查閱的資料,分別使用兩種方法來實現C#調用WCF服務:

1、直接添加服務引用;

2、使用Vs 自帶 SvcUtil工具生成服務代理類。使用的編輯器是VS2008,不同版本之前存在差異。

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

 

 

 

 

 

 

第二步、書寫需要實現的功能,針對這個項目就是調用服務的方法,按要求傳入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轉換為對象詳細可以參考博客園文章 https://www.cnblogs.com/zxtceq/p/6610214.html,文章中還給出一個轉換Json字符串給C#類的工具,我覺得非常棒。

 

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

 

 

 

 

接下來在對應的目錄下面找到代理類文件和配置文件,將配置文件的內容粘貼到實際啟動的項目的配置文件中。我在單獨一個程序里面進行了該方法的測試,實際效果跟直接添加服務引用一致。

參考資料:
https://www.cnblogs.com/pnljs/p/3765892.html

https://www.cnblogs.com/zxtceq/p/6610214.html
————————————————
版權聲明:本文為CSDN博主「freelooppowter」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/freelooppowter/article/details/81908849


免責聲明!

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



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