VS2010中添加WCF引用的问题

53 views 四月 15, 12 by Timothy

最近在公司的项目中,遇到WCF相关的各种问题,不得不说,WCF这东东虽好,不过还是有很多不足的地方,希望微软能够持续改进。前一段时间遇到的问题,就是其中的一个,问题具体情况如下:

当你在使用Add service reference欲添加一个WCF服务的时候,在Add service reference窗口会遇到如下的错误:

The maximum nametable character count quota (16384) has been exceeded while reading XML data. The nametable is a data structure used to store strings encountered during XML processing – long XML documents with non-repeating element names, attribute names and attribute values may trigger this quota. This quota may be increased by changing the MaxNameTableCharCount property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Read More

WCF service host 崩溃退出的异常

128 views 十一月 08, 11 by Timothy

最近在公司项目中,遇到莫名其妙的异常,就是当使用Windows Service作为WCF服务端宿主程序,并且使用netTcpBinding的时候,Windows服务会时不时的Crash掉。通过分析处理UnHandledException记录下的日志,异常信息大致如下:

[10/26/11 10:10:16.011],[35],ERROR,”Encountered an unhandled thread exception: System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was ’10675199.02:48:05.4775807′. —> System.IO.IOException: The read operation failed, see inner exception. —> System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was ’10675199.02:48:05.4775807′. —> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host  Read More

WCF进行大数据传输时的相关配置

321 views 七月 14, 11 by Timothy

最近一直在公司用WCF做server端,后来在做性能测试时,发现一个问题,当客户端从服务端取回一个实体对象列表时,触发了channel is faulted status的异常。

仔细分析了下这个异常,应该是传递大数据造成的,因为在回传一个包含有100多个实体对象的列表时,客户端表现正常,而当回传的实体对象列表数目达到500+时,异常就出现了。

其实WCF还是做得比较灵活的,基本所有的配置项都放在程序的app.config文件里面,改动相应参数时,不需要重新编译程序。而WCF设计的初衷,为了避免DOS一类的攻击,默认在生成配置文件时,对传输的buffer数值有一定的限制,默认是65535,也就是64KB。然而在一些特定的应用场景中,区区64KB的buffer是不能满足我们需要的。这就需要我们手动在配置文件中调整buffer的size。 Read More

IIS7中Host WCF遇到的问题

410 views 九月 03, 09 by Timothy

最近重装了系统,用上了Windows 7,在IIS7中Host WCF Service的时候,遇到一个比较奇怪的问题,当在站点下面添加应用,指向WCF的目录后,访问.svc文件,浏览器提示以下错误:

 

The page you are requesting cannot be served because of the extension configuration.
If the page is a script, add a handler. If the file should be downloaded, add a MIME map. 

 

这种错误应该是.svc文件没有映射到相关的handler上,因此IIS不知道怎么处理该请求。带着错误信息,在网上搜索了一把,终于找到了解决方法,看来搜索引擎很强大。

解决方法如下:

1.用管理员身份运行cmd命令行

2.切换到目录C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation

3.运行命令: servicemodelreg –i

这样,工具会自动把WCF相关的注册项安装到IIS7中,再打开浏览器访问WCF Service,一切正常。

细想了一下自己的装机过程,先装了VSTS和.net framework,后来发现IIS7没有在windows7里面默认安装,要到部署WCF的时候,才装好IIS7。这样在安装.net framework 3.0的时候,因为没有安装IIS7,所以一些注册项就没有起到作用。此方法可以将WCF的配置项重新配置到IIS7中,供同学们参考。

Host WCF Service in WAS

267 views 十一月 24, 08 by Timothy

WAS 是 Windows (Process) Activation Service 的缩写,是Windows Vista中所新增的一种进程宿主模型。WAS作为 IIS7.0 特有的新增功能,和以前IIS 6.0的功能相比更加强大,因为它提供并支持除HTTP之外的更多协议,比如TCP方式和Pipe(管道)方式。以下的文中,都把Windows (Process) Activation Service简称为WAS。利用WAS作为WCF(Windows Communication Foundation)的宿主,我们能充分利用WAS的很多优点,因为我们再也不用为非HTTP方式的WCF Service单独编写宿主程序了。而WAS本身的特点,也让我们的服务端程序能享受到只有以往的HTTP方式的WCF Service才能拥有的很多特性。本文也简单向大家分享一下怎样使用WAS来作为WCF Service的宿主。

以往的部署WCF Service的方式,大家一般会想到以下几种:
1. 使用WinForm或者控制台程序作为宿主
2. 使用Windows Service作为宿主
不管我们用怎样的方式来作为WCF Service的宿主,少不了的麻烦,都是需要单独编写Host程序,除此之外,就该轮到WAS了。WAS在Vista中,其实是由一个单独的Windows Service来实现的,如果我们仔细找找,就能找到,Windows Service的名称,就叫做”Windows Process Activation Service”。由此看来,WAS的进程和IIS进程在物理上是隔离开的,能为我们提供一个灵活、稳定的WCF Service宿主环境。WAS内部的工作机制,大致和ASMX WebService类似。

简单了解了WAS的特性,下面我们用一个netTcpBinding的WCF示例来演示怎样利用WAS来Host WCF Service:

首先,我们需要查看Vista的组件中,是否打开了WAS的功能,打开控制面板,打开“程序和功能”对话框,在”打开/关闭 Windows功能”对话框中,确保下面图中的功能项被打开:

其实在这一部操作之后,windows会自动帮我们在IIS中做好配置,不过为了放心,我们还是打开IIS确认一下设置是否正确。

首先是检查IIS站点中的绑定:

确保net.tcp方式,绑定到808端口

打开站点的高级设置,确认”已启用的协议”中,填有”net.tcp”,没有的话,可以补上。

然后是建立应用程序目录,这个目录等下会用来部署WCF的Service端程序。建立好目录后,也在”高级设置–已启用的协议”中,填上net.tcp

到这里,基本的host环境我们已经设置好了。下面来实现我们的服务端和客户端。

建立Contract
[code]
[ServiceContract]
public interface IService1
{
[OperationContract]
string SayHello(string value);
}
[/code]

实现简单的Service类
[code]
public class Service1 : IService1
{
public string SayHello(string value)
{
return string.Format("Hello,{0}", value);
}
}
[/code]

建立svc文件
[code]
<%@ ServiceHost Language="C#" Debug="true" Service="WCFLibrary.Service1" CodeBehind="./App_Data/Service1.cs" %>
[/code]

服务端的WCF配置
[code]










bindingConfiguration="NetTcpBinding" contract="WCFLibrary.IService1">






















[/code]

其实endpoint只需要一个即可,为了方便通过svcutil.exe生成客户端代理,需要通过另外一个endpoint的mexTcpBinding来暴露元数据。这样当服务在发布好的时候,我们可以通过
Svcutil.exe net.tcp://Timothy-T61/WCFService/HelloService.svc/mex 来生成客户端代理了。

完成服务端的编写,直接将服务端程序,部署到刚才在IIS中添加的应用程序目录中。

客户端的wcf配置如下:
[code]









bindingConfiguration="ClientBinding" contract="WCFLibrary.IService1" />

[/code]

客户端拖放一个按钮,添加如下代码:
[code]
private void button1_Click(object sender, EventArgs e)
{
ClientProxy client = new ClientProxy();
MessageBox.Show(client.SayHello("Timothy!"));
}
[/code]

一切就绪,运行程序,点击按钮:

没有单独编写host程序,通过WAS,我们的服务端正常运行了。