netwjx

混乱与有序

使用.Net Remoting的IpcChannel时发生 RemotingException : 拒绝访问 异常

| 评论

在一个使用IPC进行单机跨进称的通讯时发生了 RemotingException : 拒绝访问 异常, 期间查找异常原因的时候发现中文不大容易搜到正确的答案, 也可能是因为Remoting是已经不再支持的技术吧, 因为历史的原因还不能使用WCF, 所以这里将这个异常的原因和解决办法介绍一下.

发生这个异常的场景是一个Windows服务程序在IPC信道注册, 另外一个桌面程序连接到IPC信道通讯, 重点是在IPC信道注册的程序是Windows服务, 默认情况下它将运行在LocalSystem帐号下, 连接这个IPC信道的是另外的用户启动的进程.

错误的原因是向IPC信道注册时, 默认的授权是相同用户的进程才可以访问这个IPC信道, 可以通过下面的代码修改默认授权:

1
2
3
4
5
var dict = new Dictionary<string, string>();
dict["name"] = dict["portName"] = portName;
dict["authorizedGroup"] = "Everyone";
serverChannel = new IpcServerChannel(dict, null);
ChannelServices.RegisterChannel(serverChannel, false);

其中portName变量是IPC信道的名称

在IIS中运行的Web应用一般也是由一个IUSER_xxxxx的用户运行, 所以还有通过web.config配置方式在IPC信道注册的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0"?>
<configuration>
 <system.runtime.remoting>
   <application>
     <client>
       <wellknown type="fragrank.FragRankRemoting,FragRankLogic" url="ipc://FragRankChannel/FragRank" />
     </client>
     <channels>
       <channel ref="ipc" authorizedGroup="Everyone">
         <clientProviders>
          <formatter ref="binary"/>
         </clientProviders>
       </channel>
     </channels>
   </application>
 </system.runtime.remoting>
</configuration>

参考资料

评论

Fork me on GitHub