WCF service host 崩溃退出的异常

61 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

推荐一个黑莓9000兼容移动联通的完美Service Book下载

1,935 views 三月 07, 11 by Timothy

这是迄今为止,我找到的适合BB9000最为完美的一个Service Book了。里面的设置条目达23个,且完美兼容移动2G和联通3G网络。

具体的导入方法:

先进入BB上的Options–>Advanced Options–>Service Book

进入后,按住Alt键不放,并陆续按下:SBEB

此时,BB会弹出对话框提示:Legacy SB Restore Enabled,这时,就可以用BB连上电脑,更新Service Book了。更新后,一切就完美了……

我把这个Service Book上传到我的SkyDrive,大家可以点击这里下载

关于Win7 天气插件的问题

1,553 views 十一月 17, 09 by Timothy

最近突然发现自己Win7 gadget中的天气插件罢工了,老是显示Service not available,冥思苦想不得其解,在网上Google了一把,才找到原因,原来在将系统的Region and Language设置为非美国地区或者非英语格式后(比如设置为China),系统中的wlsrvc.dll会在运行时检查你的地区设置,如果检查到设置为India或者China,DLL会返回1506,表示天气服务在你的语言区域不可用。晕死…… 回忆了一下前些日子,为了使用一个软件,不得已改了语言设置,索性把Location改回为United Status, Format改回为English,一切又正常了,天气服务立马可用。嗯,反正我的Windows 7也是英文版的,改回来还是比较方便的方法,网上还有一种比较暴力的方法,就是替换掉那个wlsrvc.dll,有兴趣的同学可以参考下列步骤:

  1. Close and exit Windows Sidebar.
  2. Open Windows Explorer.
  3. Browse to C:\Program Files\Windows Sidebar folder.
  4. Take ownership and grant full permission to you on wlsrvc.dll file.
  5. Rename wlsrvc.dll to wlsrvc.dll.old.
  6. Download the patched wlsrvc.dll (contains inside the wlsrvc.zip).
  7. Copy the patched wlsrvc.dll into the Windows Sidebar folder.
  8. Run the sidebar.exe to restart Windows Sidebar.

IIS7中Host WCF遇到的问题

366 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

240 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,我们的服务端正常运行了。