Request Rejected
Download
Report
Transcript Request Rejected
行政院農業委員會林務局
國土資訊系統-2010生態資源資料庫分組
專業人員研習課程(實機開發篇)
服務整合技術與實務
陳恭志
民國99年9月29日
1
分組服務導向架構流通平台
Broker
分組服務導向架構
流通平台
分組、局內機關
資訊應用系統
Consumer
分組其他機關
空間倉儲系統
林務局空間資料
倉儲系統
Web Map Services(WMS)
Web Feature Services(WFS)
分組資訊
應用系統
Service Provider
局內資訊
應用系統
Web Services
2
服務開發及引用流程
1.
2.
1.
2.
3.
服務提供者(Service Provider)
服務開發及測試
服務註冊
服務引用者(Consumer)
應用系統註冊
申請引用服務
引用服務資料
3
服務開發及測試
4
開發環境
Microsoft Visual Studio 2005/2008
.NET Framework 2.0以上版本
Web Services Enhancement (WSE)
3.0
5
下載開發套件
瀏覽
http://econgisdw.forest.gov.tw/SOA/
Download/SoaComponents.zip下載
開發套件並解壓縮出以下元件
GISFCU.SQUID.WebService.dll
Microsoft.Web.Services3.dll
6
建立Web Service專案
執行工具列選項,檔案->新增專案
名稱及位置自訂
7
引用開發元件
執行工具列選項,專案->加入參考,將
開發元件加入參考
8
加入開發元件命名空間
using Microsoft.Web.Services3;
using GISFCU.SQUID.WebService;
9
修改Web Service命名空間
將http://tempuri.org/修改為
http://econgisdw.forest.gov.tw/
10
加入Policy
加入[Policy(typeof(NoPolicy))]至類
別名稱上方
11
加入wse3policyCache.config(1)
執行工具列選項,專案->加入新項目,
->Web組態檔,名稱輸入
wse3policyCache.config,點選新增
將其內容修改為如下頁所示
12
加入wse3policyCache.config(2)
<policies xmlns="http://schemas.microsoft.com/wse/2005/06/policy">
<extensions>
<extension name="kerberosSecurity" type="Microsoft.Web.Services3.Design.KerberosAssertion,
Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<extension name="requireActionHeader" type="Microsoft.Web.Services3.Design.RequireActionHeaderAssertion,
Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<extension name="usernameAssertion" type="UsernameAssertionLibrary.UsernameServiceAssertion,
UsernameAssertionLibrary" />
</extensions>
<policy name="ServerPolicy">
<kerberosSecurity establishSecurityContext="true" renewExpiredSecurityContext="true"
requireSignatureConfirmation="false" messageProtectionOrder="SignBeforeEncrypt" requireDerivedKeys="true"
ttlInSeconds="300">
<protection>
<request signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="true" />
<response signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="true" />
<fault signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
</protection>
</kerberosSecurity>
<requireActionHeader />
<usernameAssertion />
</policy>
</policies>
13
修改Web.Config(1)
於<configSections>中加入
<section name="microsoft.web.services3"
type="Microsoft.Web.Services3.Configuration.WebServicesConfiguratio
n, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/>
14
修改Web.Config(2)
於<system.web>中加入
<webServices>
<soapExtensionImporterTypes>
<add
type="Microsoft.Web.Services3.Description.WseExtensionImporter,
Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/>
</soapExtensionImporterTypes>
<soapServerProtocolFactory
type="Microsoft.Web.Services3.WseProtocolFactory,
Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/>
</webServices>
15
修改Web.Config(3)
於<configuration>中加入
<microsoft.web.services3>
<security>
<securityTokenManager>
<add type="
GISFCU.SQUID.WebService.SecurityAssertion.SQUIDUsernameToken
Manager, GISFCU.SQUID.WebService" namespace="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
localName="UsernameToken"/>
</securityTokenManager>
</security>
<policy fileName="wse3policyCache.config"/>
</microsoft.web.services3>
16
加入公開操作介面
於類別中移除public string
HelloWorld()操作介面,並加入操作
介面
[WebMethod]
public string RequestService(string
requestXml){}
大小寫需與範例相同
17
requestXml查詢參數範例(1)
<?xml version="1.0" encoding="utf-8"?>
<SQUIDReq>
<!--呼叫端資訊-->
<UserInfo>
<!--應用系統名稱-->
<Name>教育訓練用應用系統</Name>
<!--應用系統識別碼-->
<UID>335a8868-7041-4aee-ac45-bb521b3a283b</UID>
</UserInfo>
<!--服務請求資訊-->
<ServiceReq>
<Header>
<!--服務識別碼-->
<ServiceID>ec7d404b-b40c-473f-a742-0b1b89b27830</ServiceID>
<!--服務名稱-->
<ServiceName>取得系統時間</ServiceName>
</Header>
<Body>
<!--查詢標籤-->
<QueryRequest>
服務開發者自行定義標籤
<!-- QueryRequest元素內之值為服務提供者自定義之標籤-->
<Operation>GetSystemDateTime</Operation>
</QueryRequest>
</Body>
</ServiceReq>
</SQUIDReq>
18
RequestService回應範例(1)
<?xml version="1.0" encoding="utf-8"?>
<LIServiceRsgMsg>
<!--Status: 服務執行結果,0為成功,1為失敗-->
<Status>0</Status>
<!--Message: 服務執行訊息-->
<Message>執行成功</Message>
<!--ReturnRows: 資料筆數-->
<ReturnRows>1</ReturnRows>
<!--Response: 回應內容-->
<Response>
<!--Response元素內之值為服務提供者自定義之標籤-->
<SystemDateTime>2010-09-20 15:08:26</ SystemDateTime >
</Response>
</LIServiceRsgMsg>
服務開發者自行定義標籤
19
requestXml查詢參數範例(2)
<?xml version="1.0" encoding="utf-8"?>
<SQUIDReq>
<!--呼叫端資訊-->
<UserInfo>
<!--應用系統名稱-->
<Name>教育訓練用應用系統</Name>
<!--應用系統識別碼-->
<UID>335a8868-7041-4aee-ac45-bb521b3a283b</UID>
</UserInfo>
<!--服務請求資訊-->
<ServiceReq>
<Header>
<!--服務識別碼-->
<ServiceID>ec7d404b-b40c-473f-a742-0b1b89b27830</ServiceID>
<!--服務名稱-->
<ServiceName>整數相加</ServiceName>
</Header>
<Body>
<!--查詢標籤-->
<QueryRequest>
<!--Operation元素內之值為服務提供者自定義之標籤-->
<Operation>Plus</Operation>
<X>12</X>
服務開發者自行定義標籤
<Y>34</Y>
</QueryRequest>
</Body>
</ServiceReq>
</SQUIDReq>
20
RequestService回應範例(2)
<?xml version="1.0" encoding="utf-8"?>
<LIServiceRsgMsg>
<!--Status: 服務執行結果,0為成功,1為失敗-->
<Status>0</Status>
<!--Message: 服務執行訊息-->
<Message>執行成功</Message>
<!--ReturnRows: 資料筆數-->
<ReturnRows>1</ReturnRows>
<!--Response: 回應內容-->
<Response>
<!--Response元素內之值為服務提供者自定義之標籤-->
<X>12</ X >
<Y>34</Y>
<Sum>46</Sum>
服務開發者自行定義標籤
</Response>
</LIServiceRsgMsg>
21
實作RequestService範例(1)
加入using System.Xml;至引用命名空
間
加入下頁程式碼至RequestService操
作介面中
22
實作RequestService範例(2)
XmlDocument doc = new XmlDocument();
doc.LoadXml(requestXml);
XmlElement operation = doc.SelectSingleNode("/SQUIDReq/ServiceReq/Body/QueryRequest/Operation") as XmlElement;
if (operation.InnerText.Equals("GetSystemDateTime"))
{
return string.Format(@"<?xml version=""1.0"" encoding=""utf-8""?>
<LIServiceRsgMsg>
<Status>{0}</Status>
<Message>{1}</Message>
<ReturnRows>{2}</ReturnRows>
<Response>
<SystemDateTime>{3}</ SystemDateTime >
</Response>
</LIServiceRsgMsg>
", 0, "執行成功", 1, DateTime.Now);
}
return string.Format(@"<?xml version=""1.0"" encoding=""utf-8""?>
<LIServiceRsgMsg>
<Status>{0}</Status>
<Message>{1}</Message>
<ReturnRows>{2}</ReturnRows>
<Response />
</LIServiceRsgMsg>
", 1, "執行失敗", 0);
23
測試服務 – 本機測試(1)
按F5啟動服務頁面,若出現以下畫面
則選擇修改Web.config檔以啟用偵錯
並點選確定
頁面載入後點選RequestService連結
24
測試服務 – 本機測試(2)
輸入requestXml至文字框中,點選叫
用呼叫服務,若呼叫成功則服務會回應
一XML字串
<?xml version="1.0" encoding="utf8"?><SQUIDReq><UserInfo><Name>教育訓練
用應用系統</Name><UID>335a8868-70414aee-ac45bb521b3a283b</UID></UserInfo><ServiceReq>
<Header><ServiceID>ec7d404b-b40c-473fa7420b1b89b27830</ServiceID><ServiceName>取得
系統時間
</ServiceName></Header><Body><QueryRequ
est><Operation>GetSystemDateTime</Operati
on></QueryRequest></Body></ServiceReq></S
QUIDReq>
25
測試服務 – 線上測試(1)
以瀏覽器連結至
http://econgisdw.forest.gov.tw/SOA/Servic
e/TestWebService/,可瀏覽到以下畫面
26
測試服務 – 線上測試(2)
輸入服務位置,如
http://econgisdw.forest.gov.tw
/WebServiceOfSpatialDecision/Spati
alDecisionAnalysis.asmx?WSDL
輸入服務呼叫參數(如第25頁的
requestXml)
點選測試按鈕進行服務測試
若測試成功可得下頁畫面
27
測試服務 – 線上測試(3)
28
撰寫服務使用規格書
瀏覽
http://econgisdw.forest.gov.tw/SOA/
Download/服務使用規格書.doc下載服
務使用規格書範例
於註冊標準服務時需上傳服務使用規格
書
29
服務安全性設定(Optional)
服務安全性設定提供平台對服務間的資
料加密,以下為設定步驟
1. 修改服務Policy
2. 修改Web.Config設定檔
30
修改服務Policy
將[Policy(typeof(NoPolicy))]將修改
為
[Policy(typeof(UsernameTokenPolic
y))]
31
修改Web.Config設定檔
於服務專案Web.config設定檔中的
<appSettings>下加入<add
key=“SQUID_WS-Password”
value=“加密密碼”/>
32
測試加密服務 – 線上測試
勾選安全協定,並輸入加密密碼,加密
密碼為設定在Web.Config中的
SQUID_WS-Password之值
測試服務 – GIS服務(1)
以瀏覽器連結至
http://econgisdw.forest.gov.tw/SOA/S
ervice/TestGis/可瀏覽到以下畫面
34
測試服務 – GIS服務(2)
輸入服務位置如
http://aldoc.coa.gov.tw/wmsconnect
or/com.esri.wms.Esrimap?SERVICE
=wms&servicename=TALIS_WMS_
TW並選擇服務類型(WMS或WFS)
點選測試按鈕進行服務測試
若測試成功可取得WMS或WFS的
Capabilities詮釋資料,如下頁畫面
35
測試服務 – GIS服務(3)
36
服務註冊
37
登入系統
瀏覽
http://econgisdw.forest.gov.tw/SOA/
以帳號密碼登入系統
瀏覽頁面選單中我的服務->註冊服務
38
填寫服務註冊單
有*符號為必填欄位
若註冊標準服務則必需上傳服務使用規
格書
若服務為加密式服務則需勾選安全性選
項,並輸入加密密碼
送出申請單,等待系統管理員審核
審核完成後系統將發送Email通知
39
應用系統註冊
40
登入系統
瀏覽
http://econgisdw.forest.gov.tw/SOA/
以帳號密碼登入系統
瀏覽頁面選單中我的服務->註冊應用系
統
41
填寫應用系統註冊單
有*符號為必填欄位
應用系統位址請輸入應用系統IP位址
送出申請單,等待系統管理員審核
審核完成後系統將發送Email通知
42
申請引用服務
43
登入系統
瀏覽
http://econgisdw.forest.gov.tw/SOA/
以帳號密碼登入系統
瀏覽頁面選單中服務總覽->服務清單
44
申請引用(1)
瀏覽欲引用的服務,點選申請按鈕,如
45
申請引用(2)
輸入申請原因並選擇欲引用服務的應用系
統(可多筆)
送出申請單,等待服務提供者及系統管理
員審核
審核完成後系統將發送Email通知
46
引用服務資料
47
引用標準服務
申請引用標準服務
下載範例程式碼
http://econgisdw.forest.gov.tw/SOA/Down
load/RequestServiceSampleCode.zip
服務引用模組,網址為
http://econgisdw.forest.gov.tw/SOA/WebS
ervices/SoaFacade.asmx
48
標準服務引用步驟
1.
2.
3.
4.
呼叫服務引用模組,網址為
http://econgisdw.forest.gov.tw/SOA
/WebServices/SoaFacade.asmx
執行應用系統認證介面
Authenticate:確認應用系統身份
執行應用系統授權介面Authorize:
確認應用系統是否有使用服務的權限
執行呼叫服務介面RequestService:
執行服務呼叫,取得執行結果
49
加入服務引用模組(1)
執行工具列選項,專案->加入Web參考,於URL輸入
http://econgisdw.forest.gov.tw/SOA/WebServices/SoaFacade.asm
x後點選移至按鈕,並輸入Web參考名稱為ForestSoa後點選加入參
考
50
加入服務引用模組(2)
加入服務引用模組後,即可於方案總管中看到模組名稱
ForestSoa , 接 下 來 於 程 式 碼 中 加 入 名 命 空 間 [ 專 案 名
稱].ForestSoa,如WebApplication1.ForestSoa,並可使用
SoaFacade類別執行前頁所述的認證、授權及服務呼叫三個操
作介面
51
修改Web.Config
請務必於<configuration>中加入
<system.net>
<settings>
<servicePointManager expect100Continue="false" />
</settings>
</system.net>
若無加上以上設定則執行認證程序時會出現以下錯誤訊息
52
應用系統認證(1)
認證介面:string Authenticate(string
applicationId, string password)
參數說明:
applicationId為應用系統識別碼,可由瀏覽
應用系統詳細資料取得
password為應用系統密碼,亦可由應用系統
詳細資料取得,唯應用系統密碼需為應用系
統申請者才能瀏覽取得
53
應用系統認證(2)
呼叫方式:
SoaFacade facade = new SoaFacade();
string responseXml = façade.Authenticate("應用系統識別碼", "應用系統密
碼");
回應資料:XML字串,內容如
<?xml version="1.0" encoding="utf-8"?>
<AuthenticationResponse>
<!--Valid: 認證是否成功,True為成功,False為失敗-->
<Valid>True</Valid>
<!--Message :認證結果訊息-->
<Message>認證成功</Message>
<!--Token1: 認證標記,為執行Authorize介面時所需,認證失敗不會回傳此元素-->
<Token1>gok1bOZztYFnISlUXDrWsMAOkOm3SqlHbQXJlDuCjL2EBRk35TBgAL
2pDYvDsGKjmmf5ZgVPxOBzBavhZjctArHyMUzCdfqew35JoTbxFhZgQLvd+Xir1b
BJewgcGJx90UBIUneS4pKnT1PJz1SyYQiJu4FmI+RrxEVmo7OnExMWSnVkJLVh+G
6XFwVakdf5</Token1>
</AuthenticationResponse>
54
應用系統授權(1)
授權介面:string Authorize(string token1,
string serviceId)
參數說明:
token1為執行Authenticate介面取得回應的
XML中Token1元素之值
serviceId為服務識別碼,可由瀏覽服務詳細
資料取得
55
應用系統授權(2)
呼叫方式:
SoaFacade facade = new SoaFacade();
string responseXml = façade.Authorize("執行Authenticate介面取得回應的XML中
Token1元素之值", "服務識別碼");
回應資料:XML字串,內容如
<?xml version="1.0" encoding="utf-8"?>
<AuthorizationResponse>
<!--Valid: 授權是否成功,True為成功,False為失敗-->
<Valid>True</Valid>
<!--Message: 授權結果訊息-->
<Message>授權成功</Message>
<!--Token2: 授權標記,為執行RequestService介面時所需,授權失敗不會回傳此元素-->
<Token2>gok1bOZztYFnISlUXDrWsMAOkOm3SqlHbQXJlDuCjL2EBRk35TBgAL
2pDYvDsGKjmmf5ZgVPxOBzBavhZjctArHyMUzCdfqew35JoTbxFhZgQLvd+Xir1b
BJewgcGJx90UBIUneS4pJvm5yxV79gsbg4d0afKVoMTy/fTts/NU8z+IgFzU8fENxEjK
XyXWyD</Token2>
</AuthorizationResponse>
56
呼叫服務(1)
服務執行介面: string RequestService(string
token2, string serviceId, string requestXml)
參數說明:
token2為執行Authorize介面取得回應的XML
中Token2元素之值
serviceId為服務識別碼,可由瀏覽服務詳細資
料取得
requestXml為呼叫服務所需的XML格式查詢字
串如第18頁,可由瀏覽服務詳細資料下載服務
使用規格書取得
token2的有效時間為30分鐘
57
呼叫服務(2)
呼叫方式:
SoaFacade facade = new SoaFacade();
string responseXml = façade.RequestService("執行Authorize介面取得回應的XML中
Token2元素之值", "ec7d404b-b40c-473f-a742-0b1b89b27830", "requestXml查詢字串
");
回應資料:XML字串,內容如
<?xml version="1.0" encoding="utf-8"?>
<LIServiceRsgMsg>
<!--Status: 服務執行結果,0為成功,1為失敗-->
<Status>0</Status>
<!--Message: 服務執行訊息-->
<Message>執行成功</Message>
<!--ReturnRows: 資料筆數-->
<ReturnRows>1</ReturnRows>
<!--Response: 回應內容-->
<Response>
<!--Response元素內之值為服務提供者自定義之標籤-->
<SystemDateTime>2010-09-20 15:08:26</ SystemDateTime >
</Response>
</LIServiceRsgMsg>
58
重覆呼叫單一服務
SoaFacade facade = new SoaFacade();
string result1 = facade.RequestService(加密標記token2, 服務
識別碼serviceId, 查詢參數requestXml);
string result2 = facade.RequestService(token2, serviceId,
requestXml2);
59
非同步呼叫服務
SoaFacade facade = new SoaFacade();
facade.RequestServiceCompleted += new
RequestServiceCompletedEventHandler(facade_RequestS
erviceCompleted);
facade.RequestServiceAsync(加密標記token2, 服務識別碼
serviceId, 查詢參數requestXml);
private void facade_RequestServiceCompleted(object
sender, RequestServiceCompletedEventArgs e)
{
if (!e.Cancelled)
{
MessageBox.Show(string.Format("呼叫結果: {0}",
e.Result));
}
}
60
非同步重覆呼叫單一服務
SoaFacade facade = new SoaFacade();
facade.RequestServiceCompleted += new
RequestServiceCompletedEventHandler(facade_RequestService
Completed);
facade.RequestServiceAsync(加密標記token2, 服務識別碼serviceId,
查詢參數requestXml , 非同步工作唯一識別項userState);
facade.RequestServiceAsync(token2, serviceId, requestXml2 ,
userState2);
private void facade_RequestServiceCompleted(object sender,
RequestServiceCompletedEventArgs e)
{
if (!e.Cancelled)
{
MessageBox.Show(string.Format("呼叫結果: {0}",
e.Result));
}
}
61
引用GIS服務(1)
申請引用WMS/WFS服務
取得欲引用服務之識別碼,可由瀏覽服
務詳細資料取得
62
引用GIS服務(2)
取得應用系統驗證權仗,可由瀏覽應用
系統詳細資料取得
63
引用GIS服務(3)
瀏覽服務網址:
http://econgisdw.forest.gov.tw/SOA/WebServices
/GisMediator.ashx?ServiceId={服務識別
碼}&Token={應用系統驗證權仗},如
http://econgisdw.forest.gov.tw/SOA/WebServices
/GisMediator.ashx?ServiceId=d075b248-53d643a2-ac1f8d34c1234a1f&Token=Nh9ZuSFEFiQ1aNtcUCd
4duLyNwMgITnhgim5fCoLsfaCMbbs%2f%2b7Gq
IKAOUKfPd6Z
回傳WMS或WFS的Capabilities詮釋資料即表示引
用服務成功
64
簡報結束 敬請指教
65