上一章我们介绍了WCF绑定的自定义绑定,这一章我们通过一个DEMO来介绍如何创建一个基于HTTP或者TCP协议的程序。在绑定时,我们要指定WCF的地址:要为不在IIS里承接的服务指定基地址;要为所有相让服务支持的传输协议指定基地址,要指定相对于基地址的终结点地址。不要为终结点指定绝对地址,这样做的优势是:如果修改绑定使用一个不同的传输协议,修改简单的修改在配置中指定的绑定地址,而不在需要修改终结点地址。
开发环境:Visual Studio 2010 + Net Framework 4.0 。
1、创建一个WCF Service,主要代码如下:
public interface IMediaStreaming
{
[OperationContract]
Stream GetMediaStream( string mediaPath);
}
{
public Stream GetMediaStream( string mediaPath)
{
FileInfo fileInfo = new FileInfo(mediaPath);
if ( ! fileInfo.Exists)
{
throw new FileNotFoundException( " File does not exist:{0} " , mediaPath);
}
FileStream fileStream = null ;
try
{
fileStream = new FileStream(mediaPath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch
{
if (fileStream != null )
{
fileStream.Close();
fileStream.Dispose();
fileStream = null ;
}
}
return fileStream;
}
}
在实现类中,我们打开一个文件,并返回文件流到客户端。
2、右键点击App.config文件,选中Edit WCF Configuration进行编辑,我们添加2个baseAddress,一个是基于HTTP协议的;一个是基于TCP协议的。同时添加2个bindings项,一个是basicHttpBinding;一个是netTcpBinding。同时添加2个endpoint,一个是指向basicHttpBinding,一个是指向netTcpBinding。主要配置如下:
baseAddress:
< baseAddresses >
< add baseAddress = " http://localhost:8732/Design_Time_Addresses/StreamingTransfersServer/MediaStreaming/ " />
< add baseAddress = " net.tcp://localhost:9001 " />
</ baseAddresses >
</ host >
bindings:
< basicHttpBinding >
< binding name = " basicHttpStreaming " maxBufferSize = " 40000000 " maxReceivedMessageSize = " 40000000 "
messageEncoding = " Mtom " transferMode = " Streamed " />
</ basicHttpBinding >
< netTcpBinding >
< binding name = " netTcpStreaming " transferMode = " Streamed " maxBufferSize = " 40000000 "
maxReceivedMessageSize = " 40000000 " />
</ netTcpBinding >
</ bindings >
endpoint:
<!--< endpoint binding = " netTcpBinding " bindingConfiguration = " netTcpStreaming " contract = " StreamingTransfersServer.IMediaStreaming " />-->
从endpoint配置来看,我们注释了netTcpBinding。
3、添加客户端程序,添加引用,主要代码如下:
{
Console.WriteLine( " waiting... " );
using (SoundPlayer soundPlayer = new SoundPlayer())
{
using (StreamingTransfersServer.MediaStreamingContractClient client = new StreamingTransfersServer.MediaStreamingContractClient())
{
using (Stream serverStream = client.GetMediaStream( @" D:\1.wav " ))
{
soundPlayer.Stream = serverStream;
Console.WriteLine( " playing " );
soundPlayer.Play();
Console.WriteLine( " played " );
}
}
}
Console.ReadLine();
}
我们从客户端传入一个wav的文件路径,服务端根据这个路径获取到此文件流,并返回给客户端。客户端根据此文件流,播放文件。
在添加引用时,Visual Studio帮助我们生成了客户端的配置,代码如下:
< configuration >
< system.serviceModel >
< bindings >
< basicHttpBinding >
< binding name = " BasicHttpBinding_MediaStreamingContract " closeTimeout = " 00:01:00 "
openTimeout = " 00:01:00 " receiveTimeout = " 00:10:00 " sendTimeout = " 00:01:00 "
allowCookies = " false " bypassProxyOnLocal = " false " hostNameComparisonMode = " StrongWildcard "
maxBufferSize = " 40000000 " maxBufferPoolSize = " 524288 " maxReceivedMessageSize = " 40000000 "
messageEncoding = " Mtom " 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://localhost:8732/Design_Time_Addresses/StreamingTransfersServer/MediaStreaming/basicHttp "
binding = " basicHttpBinding " bindingConfiguration = " BasicHttpBinding_MediaStreamingContract "
contract = " StreamingTransfersServer.MediaStreamingContract "
name = " BasicHttpBinding_MediaStreamingContract " />
</ client >
</ system.serviceModel >
</ configuration >
我们可以看到,此时客户端与服务端通信使用的是basicHttpBinding,然后,我们修改服务端的配置,把endpoint从basicHttpBinding改为netTcpBinding,代码如下:
< endpoint binding = " netTcpBinding " bindingConfiguration = " netTcpStreaming " contract = " StreamingTransfersServer.IMediaStreaming " />
重新编译服务端,并对客户端的引用进行更新,此时,打开客户端app.config文件,我们可以看到客户端的配置已经由basicHttpBinding变为netTcpBinding,相应的配置信息与服务端是一致的,代码如下:
< configuration >
< system.serviceModel >
< bindings >
< netTcpBinding >
< binding name = " NetTcpBinding_MediaStreamingContract " closeTimeout = " 00:01:00 "
openTimeout = " 00:01:00 " receiveTimeout = " 00:10:00 " sendTimeout = " 00:01:00 "
transactionFlow = " false " transferMode = " Streamed " transactionProtocol = " OleTransactions "
hostNameComparisonMode = " StrongWildcard " listenBacklog = " 10 "
maxBufferPoolSize = " 524288 " maxBufferSize = " 40000000 " maxConnections = " 10 "
maxReceivedMessageSize = " 40000000 " >
< readerQuotas maxDepth = " 32 " maxStringContentLength = " 8192 " maxArrayLength = " 16384 "
maxBytesPerRead = " 4096 " maxNameTableCharCount = " 16384 " />
< reliableSession ordered = " true " inactivityTimeout = " 00:10:00 "
enabled = " false " />
< security mode = " Transport " >
< transport clientCredentialType = " Windows " protectionLevel = " EncryptAndSign " />
< message clientCredentialType = " Windows " />
</ security >
</ binding >
</ netTcpBinding >
</ bindings >
< client >
< endpoint address = " net.tcp://localhost:9001/ " binding = " netTcpBinding "
bindingConfiguration = " NetTcpBinding_MediaStreamingContract "
contract = " StreamingTransfersServer.MediaStreamingContract "
name = " NetTcpBinding_MediaStreamingContract " >
< identity >
< userPrincipalName value = " CS\Administrator " />
</ identity >
</ endpoint >
</ client >
</ system.serviceModel >
</ configuration >
无论是basicHttpBinding还是netTcpBinding,运行代码后,都能够听到wav文件的播放声音。至此标准绑定(HTTP/TCP)介绍完毕,其它基于MSMQ或IPC的绑定我们以后专门介绍。
出处:http: //xinhaijulan.cnblogs.com
版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。