Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。
整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。
是Windows平台上开发分布式应用最佳的实践方式。
简单的归结为四大部分:
1、网络服务的协议,即用什么网络协议开放客户端接入。
2、业务服务的协议,即声明服务提供哪些业务。
3、数据类型声明,即对客户端与服务器端通信的数据部分进行一致化。
4、传输安全性相关的定义。
wcf客户端:
对于 WCF 的客户端来说,WCF 服务就像是一个 Web Service 一样,在 Visual Studio 2008 中,所有 WCF 服务的连接都是由客户端的 服务代理(WCF Service Proxy) 来运行,开发人员不用花费太多心思在通信上,而 WCF Service Proxy 在 Visual Studio 中被称为服务引用(Service Reference)。
在 Visual Studio 中加入 WCF 的服务引用时,Visual Studio 会自动帮开发人员做掉一些必要工作(例如组态创建以及产生 Service Proxy 等),开发人员只需要在代码中取用 WCF Service Proxy 对象即可。
可以使用以下任意一种方式登录服务器:远程桌面连接(MicrosoftTerminalServicesClient,MSTSC):采用这种方式登录,请确保实例能访问公网。如果在创建实例时没有购买带宽,则不能使用远程桌面连接。
管理终端VNC:无论您在创建实例时是否购买了带宽,只要您本地有网页浏览器,都可以通过管理控制台的管理终端登录实例。
使用远程桌面连接(MSTSC)登录实例
打开开始菜单>远程桌面连接,或在开始菜单>搜索中输入mstsc。也可以使用快捷键Win+R来启动运行窗口,输入mstsc后回车启动远程桌面连接。
在远程桌面连接对话框中,输入实例的公网IP地址。单击显示选项。
输入用户名,如小鸟云默认为niaoyun。单击允许我保存凭据,然后单击连接。这样以后登录就不需要手动输入密码了。
大多数,如果不是所有的异常可以看出,在WCF轨迹(配置轨迹)和微量最好使用服务轨迹查看器查看。 这不是你应该已经跑了一整天在生产,但它有助于排除故障反正。 此外,请注意,oneways可能不会作为一个真正运行的逗射后不理地视SessionMode如果您有您的服务配置为SessionMode.Allowed甚至SessionMode.Required,该单向操作将运行 CodeGo.net,如果它不是单向的所有(这个可以观察oneways超过坦率地说,不过,我不知道这是否改变了异常,你可以得到的类型,或者当你让他们,但是,在任何情况下,你应该得到一个异常,如果该请求不能送的。AFAIK,该单向逗结束地时,enqued在服务器端,所以有地方(WCF相关的)异常在那之前(序列化/反序列化记)。 那么,这样的相关异常见过最好的(甚至是IErrorHandler接口并没有让他们都因时,它被称为在请求/响应流量的事实)使用轨迹/ traceviewer。2. 如何处理故障的官方是在这里: 处理异常和 故障 了解状态 变化 与主网页是在信道模型概述 有一个很好的状态示出的事情是如何发生的:
3. 异常情况将发生故障的代理。你不能AFAIK做很多有关:不异常-P 我有点惊讶的是单向还是个问题,但对于吞咽属升,有学分: 是你扔的故障看或异常看它很重要(而且应该是逗错误地) 作为一个hacker,你可以启用调试-但是请关闭此服务! 你在逗使用地的服务对象看我刚刚在博客上这个确切的主题...基本上,你的逗使用地可吞异常。 3个选项: 唐的逗使用地 子类的代理和重写的Dispose() 把它包,按照该博客
4. 通常情况下,WCF服务承载在ServiceHost中,如果WCF的服务失败,那么唯一的选择就是killWCF服务,并开始一个新的。 在ServiceHost有一个事件触发器逗断块地的时候,WCF服务失败时被激活:
ServiceHost host = new ServiceHost(new Service.MyService())
host.Faulted += new EventHandler(host_faulted)
host.Open()
这是可能得到异常的故障,但它需要多一点的工作:
public class ErrorHandler : IErrorHandler
{
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
}
public bool HandleError(Exception error)
{
Console.WriteLine("exception")
return false
}
}
public class ErrorServiceBehavior : IServiceBehavior
{
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint>endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
ErrorHandler handler = new ErrorHandler()
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
dispatcher.ErrorHandlers.Add(handler)
}
}
}
ServiceHost host = new ServiceHost(new Service.MyService())
host.Faulted += new EventHandler(host_faulted)
host.Description.Behaviors.Add(new ErrorServiceBehavior())
host.Open()
积分
5. 大约2)... 诀窍在于,你逗使用地,应始终在抛出异常的代理调用Abort()。文章WCF疑难杂症解释这一切。 服务类的文章,它包装服务调用者的启发。这是从我的项目的示例代码:
ServiceHelper<CodeListServiceClient, CodeListService.CodeListService>.Use(
proxy =>seasonCodeBindingSource.DataSource = proxy.GetSeasonCodes(brandID)
)
这是ServiceHelper的代码,从文章略加修改。到目前为止,它已经真的很好。
using System
using System.ServiceModel
namespace Sportina.EnterpriseSystem.Client.Framework.Helpers
{
public delegate void UseServiceDelegate<TServiceProxy>(TServiceProxy proxy)
public static class ServiceHelper<TServiceClient, TServiceInterface>where TServiceClient : ClientBase<TServiceInterface>, new() where TServiceInterface : class
{
public static void Use(UseServiceDelegate<TServiceClient>codeBlock)
{
TServiceClient proxy = null
bool success = false
try
{
proxy = new TServiceClient()
codeBlock(proxy)
proxy.Close()
success = true
}
catch (Exception ex)
{
Common.Logger.Log.Fatal("Service error: " + ex)
throw
}
finally
{
if (!success &&proxy != null)
proxy.Abort()
}
}
}
}
6. 我有一个问题,即通道仍然处于故障状态的异常之后。这将服务于任何后续连接被渲染。 从故障状态恢复服务的修复是处理通道发生故障的事件:
channelFactory = new ChannelFactory<IService>(endpoint)
channelFactory.Faulted += OnChannelFaulted
var channel = channelFactory.CreateChannel()
然后定义OnChannelFaulted:
void OnChannelFaulted(object sender, EventArgs e)
{
channelFactory.Abort()
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)