代理發現服務
① 如何利用」發現代理」實現可用服務的實時維護
一、發現代理與Managed發現模式
至於發現服務如何進行可用服務的實時維護,則是具體實現上的選擇問題。不過WS-Discovery通過目標服務的通知機制來解決發現代理維護的服務的實時可用性。具體來說就是賦予了發現代理監聽服務上下線通知的能力,並根據接收到的通知來進行可用服務的動態注冊和注銷。不過與Ad-Hoc模式下採用廣播模式的通知不同,在Managed模式下,目標服務只需要專門針對發現代理發送通知就可以了。
在Ad-Hoc模式下,我們採用UdpAnnouncementEndpoint實現了廣播式的通知,而在Managed模式則直接使用AnnouncementEndpoint終結點進行單播式的通知。該終結點的地址就是發現代理的地址。同理,在Ad-Hoc模式下我們進行廣播式服務探測和解析是通過UdpDiscoveryEndpoint終結點來進行的,在Managed模式下我們可以直接使用DiscoveryEndpoint終結點實現客戶端向發現代理單方面的可用服務的探測和解析請求。
發現代理部僅僅局限於Managed模式,同樣可以使用在Ad-Hoc模式下。在Ad-Hoc模式下,發現代理可以像目標服務一樣監聽來自客戶端發出的廣播式的Probe/Resolve請求,也可以像客戶端一樣監聽來自服務端發出的廣播式的Helle/Bye通知。所以UdpDiscoveryEndpoint和UdpAnnouncementEndpoint同樣可以應用在發現代理上。
發現代理本質上就是一個服務,它的核心功能就是接收客戶端發送的針對可用服務探測和解析的Probe/Resolve請求,並回復以相應的PM和RM消息。至於上面提到的對目標服務上/下線通知監聽能力只是具體實現對可用服務維護的一種方式而已。
二、通過繼承DiscoveryProxy創建發現代理
發現服務本質上就是一個WCF服務,並且這個服務實現的服務契約定義的操作應該基於定義在WS-Discovery中的幾種基本的消息交換:Probe/PM、Resolve/RM和Hello/Bye。交換的消息在針對不同版本的WS-Discovery(WSDiscoveryApril2005、WSDiscovery11和WSDiscoveryCD1)又具有不同的要求。即使針對某個具體版本的WS-Discovery,Probe/PM和Resolve/RM的消息也會因採用Ad-Hoc或者Managed模式又有所不同。如果你需要創建一個同時支持不同版本WS-Discovery的發現代理服務,就應該實現DiscoveryEndpoint和AnnouncementEndpoint終結點所實現的所有服務契約。
所以說要自己從頭到尾去定義這么一個發現代理服務並不是一件容易的事情。為了使開發人員可以無需關注具體的消息交換的細節,幫助他們容易的定義發現代理,WCF提供了一個抽象類DiscoveryProxy。我們只需要將我們自定義的發現代理服務類型繼承該類並且重寫相應的方法就可以了。
下面的代碼給出了DiscoveryProxy的核心方法的定義。正如我們上面的分析,作為一個完備的發現代理服務應該實現DiscoveryEndpoint和AnnouncementEndpoint終結點所實現的所有服務契約,在這里得到了證實。DiscoveryProxy定義了4組抽象的OnBegingXxx/OnEndXxx方法,分別針四個基本的服務發現操作(消息交換):服務探測(Probe/PM)、服務解析(Resolve/RM)、上線通知(Hello)和離線通知(Bye)。作為繼承自DiscoveryProxy的自定義發現代理服務,只需要重寫這些抽象方法既可。
1: public abstract class DiscoveryProxy :
2: ,
3: IAnnouncementContract11,
4: IAnnouncementContractCD1,
5: ,
6: ,
7: IDiscoveryContractApril2005,
8: IDiscoveryContractAdhoc11,
9: IDiscoveryContractManaged11,
10: IDiscoveryContractAdhocCD1,
11: IDiscoveryContractManagedCD1, ...
12: {
13: //Find(Probe)
14: protected abstract IAsyncResult OnBeginFind(FindRequestContext findRequestContext, AsyncCallback callback, object state);
15: protected abstract void OnEndFind(IAsyncResult result);
16:
17: //Resolve
18: protected abstract IAsyncResult OnBeginResolve(ResolveCriteria resolveCriteria, AsyncCallback callback, object state);
19: protected abstract EndpointDiscoveryMetadata OnEndResolve(IAsyncResult result);
20:
21: //Online Announcement(Hello)
22: protected abstract IAsyncResult OnBeginOnlineAnnouncement(DiscoveryMessageSequence messageSequence, EndpointDiscoveryMetadata
23: endpointDiscoveryMetadata, AsyncCallback callback, object state);
24: protected abstract void OnEndOnlineAnnouncement(IAsyncResult result);
25:
26: //Offline Announcement(Bye)
27: protected abstract IAsyncResult OnBeginOfflineAnnouncement(DiscoveryMessageSequence messageSequence, EndpointDiscoveryMetadata
28: endpointDiscoveryMetadata, AsyncCallback callback, object state);
29: protected abstract void OnEndOfflineAnnouncement(IAsyncResult result);
30:
31: //其他成員
32: }
三、實例演示:自定義發現代理服務
接下來我們將通過一個簡單的實例演示如何自定義發現代理服務,以及如何利用這個發現代理構建一個基於Managed模式的服務發現環境以實現服務的自動注冊和服務的動態調用。實例解決方法依然採用之前的結構,並且直接使用定義好的CalculatorService作為目標服務。
步驟一、創建自定義發現代理服務
我們首先通過繼承DiscoveryProxy創建一個自定義的發現代理服務,我們將它起名為DiscoveryProxyService。由於我們要重寫的方法都是非同步模式的,OnBeginXxx的輸出和OnEndXxx的輸入都是一個IAsyncResult類型的對象,所以我們先要定義一個實現IAsyncResult介面的類型。為了簡單起見,我們在Servie項目中定義的如下一個最為簡單的DiscoveryAsyncResult(其實它根本起不到非同步執行的目的)。
1: using System;
2: using System.ServiceModel.Discovery;
3: using System.Threading;
4: namespace Artech.WcfServices.Service
5: {
6: public class DiscoveryAsyncResult : IAsyncResult
7: {
8: public object AsyncState { get; private set; }
9: public WaitHandle AsyncWaitHandle { get; private set; }
10: public bool CompletedSynchronously { get; private set; }
11: public bool IsCompleted { get; private set; }
12: public EndpointDiscoveryMetadata Endpoint { get; private set; }
13:
14: public DiscoveryAsyncResult(AsyncCallback callback, object asyncState)
15: {
16: this.AsyncState = asyncState;
17: this.AsyncWaitHandle = new ManualResetEvent(true);
18: this.CompletedSynchronously = this.IsCompleted = true;
19: if (callback != null)
20: {
21: callback(this);
22: }
23: }
24: public DiscoveryAsyncResult(AsyncCallback callback, object asyncState,
25: EndpointDiscoveryMetadata Endpoint)
26: : this(callback, asyncState)
27: {
28: this.Endpoint = Endpoint;
29: }
30: }
31: }
我們來創建我們自定義如下一個發現代理服務DiscoveryProxyService,我們通過在類型上應用ServiceBehaviorAttribute特性將DiscoveryProxyService定義成一個單例服務,並且支持並發。
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.ServiceModel;
5: using System.ServiceModel.Discovery;
6: namespace Artech.WcfServices.Service
7: {
8: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Multiple)]
9: public class DiscoveryProxyService : DiscoveryProxy
10: {
11: public IDictionary<EndpointAddress, EndpointDiscoveryMetadata> Endpoints { get; private set; }
12: public DiscoveryProxyService()
13: {
14: this.Endpoints = new Dictionary<EndpointAddress, EndpointDiscoveryMetadata>();
15: }
16:
17: //Find(Probe)
18: protected override IAsyncResult OnBeginFind(FindRequestContext findRequestContext, AsyncCallback callback, object state)
19: {
20: var endpoints = from item in this.Endpoints
21: where findRequestContext.Criteria.IsMatch(item.Value)
22: select item.Value;
23: foreach (var endppint in endpoints)
24: {
25: findRequestContext.AddMatchingEndpoint(endppint);
26: }
27: return new DiscoveryAsyncResult(callback, state);
28: }
29: protected override void OnEndFind(IAsyncResult result) {}
30:
31: //Resolve
32: protected override IAsyncResult OnBeginResolve(ResolveCriteria resolveCriteria, AsyncCallback callback, object state)
33: {
34: EndpointDiscoveryMetadata endpoint = null;
35: if (this.Endpoints.ContainsKey(resolveCriteria.Address))
36: {
37: endpoint = this.Endpoints[resolveCriteria.Address];
38: }
39: return new DiscoveryAsyncResult(callback, endpoint);
40: }
41: protected override EndpointDiscoveryMetadata OnEndResolve(IAsyncResult result)
42: {
43: return ((DiscoveryAsyncResult)result).Endpoint;
44: }
45:
46: //OnlineAnnouncement
47: protected override IAsyncResult OnBeginOnlineAnnouncement(DiscoveryMessageSequence messageSequence, EndpointDiscoveryMetadata
48: endpointDiscoveryMetadata, AsyncCallback callback, object state)
49: {
50: this.Endpoints[endpointDiscoveryMetadata.Address] = endpointDiscoveryMetadata;
51: return new DiscoveryAsyncResult(callback, state);
52: }
53: protected override void OnEndOnlineAnnouncement(IAsyncResult result) {}
54:
55: //OfflineAnnouncement
56: protected override IAsyncResult OnBeginOfflineAnnouncement(DiscoveryMessageSequence messageSequence, EndpointDiscoveryMetadata
57: endpointDiscoveryMetadata, AsyncCallback callback, object state)
58: {
59: if (this.Endpoints.ContainsKey(endpointDiscoveryMetadata.Address))
60: {
61: this.Endpoints.Remove(endpointDiscoveryMetadata.Address);
62: }
63: return new DiscoveryAsyncResult(callback, state);
64: }
65: protected override void OnEndOfflineAnnouncement(IAsyncResult result) {}
66: }
67: }
DiscoveryProxyService具有個IDictionary<EndpointAddress, EndpointDiscoveryMetadata>類型的屬性Endpoints表述可用的目標服務列表。在處理服務上線通知的OnBeginOnlineAnnouncemen/OnEndOnlineAnnouncement方法中講代表上線服務的EndpointDiscoveryMetadata添加到Endpoints列表中。而在處理服務離線通知的OnBeginOfflineAnnouncement/OnEndOfflineAnnouncement方法中則將代表離線服務的EndpointDiscoveryMetadata從Endpoints列表中移除。
而處理客戶端服務探測請求的OnBeginFind/OnEndFind方法中,從傳入的FindRequestContext中獲得代表匹配條件的FindCriteria對象,並通過它從Endpoints列表中找到匹配的EndpointDiscoveryMetadata,最終通過調用的AddMatchingEndpoint方法將它們添加到FindRequestContext之中。至於用於處理服務解析請求的OnBeginResolve/ OnEndResolve則只需要從Endpoints列表中將與給定的終結點地址一致的EndpointDiscoveryMetadata返回就可以了。
步驟二、寄宿發現代理服務和目標服務
現在我們需要寄宿上面創建的自定義發現代理服務DiscoveryProxyService和代表目標服務的CalculatorService,我們把所有的設置都定義在如下的配置中。
② 代理伺服器問題
第一類代理,那是因為代理伺服器僅作中轉作用.或者是你沒有成功使用代理.所以沒不到隱藏IP的作用.
第二類代理,其代理轉出IP是動態的,明顯的如ADSL,分配給你的IP是動態的,你可能今天在廣州,明天就在北京.是正常的.
你的目的是隱藏自己的IP而不被人追蹤到.
你需要尋找比較專業的代理伺服器,例如付費的,或者國外的.相對而言比一些個人的小型代理要專業的多.
簡單來說,隨便拿個網吧弄個ccproxy就可以作代理了.但不定因素很多.還是找專業的代理吧.或者多層代理.至於多層代理,非一般IT菜鳥所用.不作詳解,我也不太懂,呵呵.
③ 代理伺服器是什麼什麼意思
(Proxy)是網路信息的中轉站,比方說HTTP代理伺服器。我們使用網路瀏覽器直接鏈回接其他Internet站點並取得網路信息時答,需送出Request信號來得到回答,然後對方再把信息傳送回來。代理伺服器是介於瀏覽器和Web伺服器之間的一台伺服器,有了它之後,瀏覽器不是直接到Web伺服器去取回網頁而是向代理伺服器發出請求,Request信號會先送到代理伺服器,由代理伺服器來取回瀏覽器所需要的信息並傳送給你。
而且大部分代理伺服器都具有緩沖功能,就好像一個大Cache,它不斷將新取得的數據保存到它本機的存儲器上,如果瀏覽器所請求的數據在它本機的存儲器上已經存在而且是最新的,那麼它就不重新從Web伺服器取數據,而直接將存儲器上的數據傳送給用戶的瀏覽器,這樣就能顯著提高瀏覽速度和效率。
④ 代理自動發現服務無法關閉。
管理工具-服務
閑得無聊,來看看
⑤ winHTTP Web 代理自動發現服務是干什麼的
實現 Windows HTTP 服務(WinHTTP)的 Web 代理自動發現服務(WPAD)。WPAD 是用於啟用 HTTP 客戶端自動發現代理配置的協議。如果此服務被停用或禁用,WPAD 協議將在 HTTP 客戶端的進程中執行,而不是在外部服務進程;因此不會造成功能損失。
⑥ sip用戶代理伺服器之間如何相互發現
查找代理和重定向伺服器的位置方法:
1.DNS
2.手工配置
3.TFTP的option 66
⑦ 通過代理伺服器上網會被網管發現嗎
先攻擊網管的機子,整死他,他就只能忙著修機器哦。。
⑧ winhttp web代理自動發現服務是什麼意思
實現 Windows HTTP 服務(WinHTTP)的 Web 代理自抄動發襲現服務(WPAD)。WPAD 是用於啟用 HTTP 客戶端自動發現代理配置的協議。如果此服務被停用或禁用,WPAD 協議將在 HTTP 客戶端的進程中執行,而不是在外部服務進程;因此不會造成功能損失。
⑨ 代理自動發現服務怎麼關閉
運行MSCONFIG.EXE 找到auto discovery service 然後禁止就行了