在WCF中一些基于HTTP之上的綁定可以用TcpTrace跟蹤消息。借助此工具可以使我們有機會了解一些功能的工作方式,如可靠性會話在網絡斷開的情況下是如何向服務端發送消息。
TcpTrace的界面非常簡潔,簡潔的有點讓人不知所措。
Listen on Port:TcpTrace要監聽的本機端口
Destination Server:對TcpTrace監聽的端口的任何訪問都將轉發到目標服務器
Destination Port:對TcpTrace監聽的端口的任何訪問都將轉發到目標服務器的這個端口
如在瀏覽地址欄輸入: http://127.0.0.1:8080 或者 http://localhost:8080 ,將會自動轉發到對 http://www.google.com:80 的訪問,
結果如圖:
簡單的了解了下TcpTrace如何工作的,下面寫個實例來演示用它如何跟蹤WCF消息。
實體類:
using
System.ServiceModel;
using
System.Runtime.Serialization;
namespace
FruitModel
{
[DataContract(Namespace
=
"
http://www.cnblogs.com/qiuwuyu
"
)]
public
class
Fruit
{
private
string
m_Name;
private
string
m_Price;
[DataMember]
public
string
Name
{
get
{
return
m_Name; }
set
{ m_Name
=
value;}
}
[DataMember]
public
string
Price
{
get
{
return
m_Price; }
set
{ m_Price
=
value;}
}
}
}
服務契約:
using
System.ServiceModel;
using
FruitModel;
namespace
IFruit
{
[ServiceContract(Namespace
=
"
http://www.cnblogs.com/qiuwuyu
"
)]
public
interface
IFruitService
{
[OperationContract]
Fruit GetFruit();
}
}
服務實現:
using
System;
using
FruitModel;
using
IFruit;
namespace
FruitSvc
{
public
class
FruitService:IFruitService
{
public
Fruit GetFruit()
{
Fruit f
=
new
Fruit();
f.Name
=
"
banana
"
;
f.Price
=
"
6.00
"
;
return
f;
}
}
}
寄存服務:
using
System;
using
System.ServiceModel;
using
System.ServiceModel.Description;
using
IFruit;
using
FruitSvc;
namespace
FruitHost
{
class
Program
{
static
void
Main(
string
[] args)
{
using
(ServiceHost host
=
new
ServiceHost(
typeof
(FruitService),
new
Uri(
"
http://localhost:8000
"
)))
{
WSHttpBinding binding
=
new
WSHttpBinding();
binding.ReliableSession.Enabled
=
true
;
binding.Security.Mode
=
SecurityMode.None;
//
改變地址端口為8080,這樣可以支持服務消息發送到8080端口,8000設置為監聽端口
host.AddServiceEndpoint(
typeof
(IFruitService), binding,
new
Uri(
"
http://localhost:8080/FruitService
"
),
new
Uri(
"
http://localhost:8000/FruitService
"
));
host.Open();
Console.WriteLine(
"
Fruit Service Is Running...
"
);
Console.ReadLine();
}
}
}
}
客戶端調用:
using
System;
using
System.ServiceModel;
using
IFruit;
using
FruitModel;
namespace
FruitClient
{
class
Program
{
static
void
Main(
string
[] args)
{
EndpointAddress epAddr
=
new
EndpointAddress(
"
http://localhost:8080/FruitService
"
);
WSHttpBinding wsbinding
=
new
WSHttpBinding();
wsbinding.ReliableSession.Enabled
=
true
;
wsbinding.Security.Mode
=
SecurityMode.None;
using
(ChannelFactory
<
IFruitService
>
factory
=
new
ChannelFactory
<
IFruitService
>
(wsbinding, epAddr))
{
IFruitService proxy
=
factory.CreateChannel();
Fruit f
=
proxy.GetFruit();
if
(f
!=
null
)
{
Console.WriteLine(
"
Name:
"
+
f.Name
+
"
Price:
"
+
f.Price);
}
}
Console.WriteLine(
"
Fruit Client Is Running...
"
);
Console.ReadLine();
}
}
}
可以看到現在客戶端訪問的服務端口為8080,而服務監聽端口為8000,此時,運行程序客戶端將不能夠調用服務,因為服務端不監聽8080端口。可以用TcpTrace做個消息轉發,讓它監聽8080端口,把任何訪問8080端口的消息轉發到8000端口。這樣TcpTrace就有機會捕捉客戶端與服務端的任何通訊消息。可以如下設置TcpTrace
程序的運行結果如下:
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

