zoukankan      html  css  js  c++  java
  • 关于IIS7 host WCF service支持netTCP协议问题

    在用IIS7 host WCF服务时,准备使用传说中IIS7支持的netTCP协议,过程中遇到以下问题:

    第一个问题
    站点绑定添加于修改也可以直接通过IIS管理器进行:选择相应站点=〉在右边的部分“Bindings”=〉在弹出的Site Bindings对话框中可以添加新的站点绑定和编辑现有的站点绑定,弹出的Site Bindings对话框中的类型中没有net.tcp类型
    运行appcmd.exe set site 可以将该网站设置上net.tcp类型,但不可在IIS7上编辑、删除

    第二个问题
    运行appcmd.exe set app "localhost/MyService" /enabledProtocols:net.tcp 后,站点下的应用程序浏览后显示:
    Http Error 503. The service is unavailable.
    每次都是这样,这个IIS7 host的服务就无法连接上了;

    第三个问题
    客户端在调用基于netTCP的WCF接口时总是抛出异常:无法激活请求的服务“net.tcp://localhost/WasHostingDemo/CalculatorService.svc”....

    环境是Vista Business,VS2008 sp1,开启了WAS non-http support。

    问题解决:
    第一个问题,安装了Vista的sp1包之后解决,Binding可以添加支持的任意一种类型。
    网站默认不能启动,按启动后出现“Windows 进程激活服务 (WAS) 和万维网发布服务 (W3SVC) 未启动。。。”
    通过在命令提示符处键入 net start W3SVC 并按 Enter,可以同时启动 WAS 和 W3SVC。(键入 net start WAS 可以单独启动W3SVC)

    第二个问题,appcmd set app "localhost/MyService" /enabledProtocols:http,net.tcp,net.msmq
    用这个命令添加支持协议不是增量式添加,一定要将准备支持的协议都enabled!

    第三个问题
    解决过程中出现新问题1:调试了几次后,用IIS host 使用了wsDualHttp协议的服务后,浏览服务出现了以下错误:
    “MyService”应用程序中的服务器错误——无法加载DLL“mqrt.dll”:找不到指定的模块。(异常来自HRESULT:0x8007007E)
    新问题1解决运行appcmd set app "localhost/MyService" /enabledProtocols:http,net.tcp更改应用程序设置后正常(net.msmq协议接口中暂未用到)。估计是应用程序池崩溃了,需要重启。

    今天终于将问题完全搞定!事情原来是这样的:
    在非IIS host的程序中,因为有个问题,WCF的bug貌似(Artech在他的博客中谈到这个问题:WCF技术剖析之六:为什么在基于ASP.NET应用寄宿(Hosting)下配置的BaseAddress无效),所以在服务的endpoint 中我们这么写:
    <endpoint address="net.tcp://localhost/MyService" binding="netTcpBinding" contract="MyService.IMyService" />
    但是,在IIS中BaseAddress是无效的,IIS自动加了应用程序站点名称作为前缀,即:"net.tcp://localhost/MyService",所以我们在IIS host的WCF服务里的配置文件的endpoint address中再写一遍地址就重复了,导致服务无法正确读取。
    IIS host的WCF 服务正确的endpoint的配置写法是:
    <endpoint address="" binding="netTcpBinding" contract="MyService.IMyService" />


    我IIS7 host的WCF服务终于正确的调用起来啦!小小庆祝一下。。。

    2009.9.22 add new
    在IIS7中,
    网站本身不能用于host 使用netTcp协议的WCF服务。如果要hostWCF服务,则必须用网站下挂的应用程序,并且给应用程序注册支持netTcp协议。注册协议时,netTcp用的哪个端口譬如net.tcp 8008:* 那么调用该端口的客户端web.config中的endpoint address=“net.tcp://machineName:8008/xxxService/xxx.svc”

    另外,svc文件中必须注明CodeBehind="App_Code\xxx.cs"或者其它服务接口类实现代码所在文件。

  • 相关阅读:
    lua时间戳和日期转换及踩坑【转】
    Js正则表达式验证输入是否有特殊字符【转】
    PHP数据类型转换【转】
    JavaScript indexOf() 方法
    CSS文本下划线 删除线 上划线【转】
    PHP中把stdClass Object转array的几个方法【转】
    2020软件工程作业02
    2020软件工程作业01
    2020 CCPC Wannafly Winter Camp Day1-F-乘法
    牛客-装货物
  • 原文地址:https://www.cnblogs.com/cubean/p/1555223.html
Copyright © 2011-2022 走看看