台灣最大程式設計社群網站
線上人數
1924
 
會員總數:243653
討論主題:188248
歡迎您免費加入會員
討論區列表 >> ASP.NET >> 關於Webservice介接的問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
關於Webservice介接的問題
價值 : 5 QP  點閱數:648 回應數:14

樓主

楓葉知秋
門外漢
0 3
94 6
發送站內信

各位前輩們好~
小弟最近遇到的狀況非常的奇怪
A、B:Webservice C:DB(MSSQL)
A→B→C
A是對外的Webservice,B是內部的WebService,A是利用介接的方式去使用B的webservice
奇怪的問題來了,當我使用A的function呼叫出相關資料時,特定的SQL語句會執行很久
可是當我是用B的function呼叫出相關資料時,特定的語句遽然瞬間秒執行完成
當然我也有把SQL語句直接都到DB執行看看,結果跟B去呼叫的結果一樣,瞬間秒執行完成
於是我很好奇的在B的Webservice加上LOG
可是發現到從A去呼叫的時候,LOG訊息的user address來源是A的
而用B去呼叫user address來源是B的
不好意思岔開話題

我想問的是
會有可能不同的webservice因介接方式去呼叫,產生不同的SQL語句執行的狀況嗎?
A呼叫撈取資料的SQL語句與B呼叫撈取資料的SQL語句
執行的狀況也不一樣?
難道這關係到provider的問題?

再請各位前輩們解惑
THANKS ALL


搜尋相關Tags的文章: [ Webservice ] ,
本篇文章發表於2018-01-15 20:59
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
問題好像有點複雜
所以問題切分一下,先把一些您覺得可疑的狀況釐清

A呼叫撈取資料的SQL語句與B呼叫撈取資料的SQL語句

這部分,可以開啟SQL的Profile,將兩種狀況的SQL語法錄製下來,再來比較觀察
如果都相同,這『SQL語句』因素就可以排除了
(比較完,不要忘記關閉Profile)

我很好奇的在B的Webservice加上LOG
可是發現到從A去呼叫的時候,LOG訊息的user address來源是A的
而用B去呼叫user address來源是B的

這部分是小喵從您的描述中,覺得比較奇怪的點
A呼叫B,小喵想問,這部分,您怎麼介接的?
加入服務參考?還是直接呼叫?
您Log User Address,Log的方式是?

以上訊息提供參考

^_^
本篇文章回覆於2018-01-16 09:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

楓葉知秋
檢舉此回應
Hi 喵版大
SQL語句確定用Profile去看的,所以應該不是SQL語句的問題

介接的部分是用服務參考的方式
Log User Address是http request userhostname
LOG是另外寫出來一段function,所以沒有仔細提到
SORRY,再請喵版大解惑
THANKS
本篇文章回覆於2018-01-16 16:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
A是對外的web service

A跟B跟C都在同一個區域網路內嗎?
(還是只有B跟C在同一個區域網路內?)

本篇文章回覆於2018-01-16 17:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

楓葉知秋
檢舉此回應
A有兩張網卡 一張對外IP 一張區域網路內的
B跟C都是區域網路內的
本篇文章回覆於2018-01-16 19:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
暴力除錯...

【使用A的function來呼叫B】

1. 從【外部網路】連到A, 【使用A的function來呼叫B】
2. 從【區域網路】連到A, 【使用A的function來呼叫B】

如果2者的存取速度完全不一樣, 那就是外部網路問題
=====================

倘若一樣的話,
再從區域網路測試以下問題

測試程式 連到A, 再連到B再連到SQL
vs
測試程式 連到B, 再連到SQL

(各別在A, B都記錄執行function時所花費的時間, 可以找出是哪一個環節浪費了大量的時間...)
本篇文章回覆於2018-01-17 10:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

楓葉知秋
檢舉此回應
HI 小羊
這部分LOG有放置過了喔~
就是因為放LOG才知道說某個的SQL語句去下會執行很久
然後今天我突發奇想
我把A的站台移到B的站台裡去RUN
結果很神奇的是原先會RUN很久的語句,秒執行= =
反而是更前一段執行的SQL語句RUN的時間變長了.....
天阿~~
Webservice還真難懂....
本篇文章回覆於2018-01-17 10:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應

•B去向資料庫要資料:秒完成
•A連到B,由B去向資料庫要資料來交給A:時間拖很長
•(B所執行的function實際上是同一個,只是執行方式不同!!)

請把B取得資料所花的時間列出來
再把A連結B所花的時間列出來


應該可以確定是A連到B所發生的問題(不會是特定SQL語句)
要交叉比對的話就是在B多建立幾個測試function,讓A來連線測試(看看花費的時間)

本篇文章回覆於2018-01-17 12:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

楓葉知秋
檢舉此回應
TO 小羊
執行方式不同,這句我不懂
執行不都是由B去執行function嗎?

我也正在弄交叉比對= =
只是這部分會花不少時間= =


本篇文章回覆於2018-01-17 14:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
小喵也在思考怎麼做交叉比對測試的順序
推#7

不過,題外話,既然B->C是內部
有沒有考慮直接用 dll 直接跑

或者改用WCF,可以用tcpip跑(非http)
tcpip的速度會快很多很多(相對http來說)

^.^a
本篇文章回覆於2018-01-17 15:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

楓葉知秋
檢舉此回應
TO 喵版大
因為程式是接手的,所以不太想動到以前的程序
畢竟蠻龐大的
本篇文章回覆於2018-01-17 15:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應

前者:(秒完成)
1.【Client (瀏覽器or其他程式)】連到B(執行function getData001),
2.再由B連到C
3.然後C將資料傳給B,
4.最後B將資料交給【Client (瀏覽器or其他程式)】,顯示出來


後者:(時間拖很長)
1.【Client (瀏覽器or其他程式)】連到A(執行function myRun),
2.再由A連到B(執行function getData001),
3.再由B連到C,
4.然後C將資料傳給B,
5.再由B將資料傳給A,
6.最後由A將資料交給【Client (瀏覽器or其他程式)】,顯示出來





註:myRun 與 getData001是我舉例的函數
(只是用來表達B的部份做同一件事, 然而2者所耗費的時間卻天差地遠...)

在這種狀況下,鐵定是A的部份受到網路影響而造成時間拖很長
因為B做的事件是同一件事,花費的時間應該要相同,
本篇文章回覆於2018-01-17 15:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

誰是誰
檢舉此回應
檢查一下 A <--> B 之間的路由設定,搞不好 routing 到外面又繞回來。
本篇文章回覆於2018-01-18 12:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
我是想問一件事。是否都是運行同一段sql碼?
然後是否只有第一次會慢。(無論是a連或是b連)

其實我以前就曾經有過這樣的經驗,有時會秒開有時不會。
後來才發現秒開的原因是因為sql本身有所謂緩存的機制。

同樣的請求語法,在第二次就會秒開。但有時不會。(原因是因為資料有變動了)

也就是說,因為緩存的關係,於第二次運行時自然就會秒開。因為他不需要再重新撈資料。

當初會這樣子發現的原因是,我撈的資料不管怎麼樣都不可能可以在3秒內完成。
但是它居然是在0.0000??秒完成了。
才讓我去研究這個特性。

所以我想說,先不要去研究為何會變慢。先去研究為何會變快的原因。
本篇文章回覆於2018-01-18 18:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

楓葉知秋
檢舉此回應
HI ALL
TO 小羊
我一開始也認為是網路設定的問題
這部分我也有問過,可是奇怪的問題是
時快時慢,導致我抓蟲很難抓= =

TO 誰是誰
我有下過tracert、pathping
可是點都一樣,沒出去回來的狀況

TO 浩瀚星空
我也有想過所謂的緩存的問題(第一次慢、第二次快)
可是我測試的當下
A就算下兩次函數執行,也是相同的結果

所以目前的想法,自己額外在A的部份另外寫幾個Function去做交叉比對看看
本篇文章回覆於2018-01-18 21:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.