2011-12-11 98 views
0

每当试图连接到我的selfhosted wcf时,我会收到一个超时异常。自我托管wcf与nettcp异常

这是我的配置有:

<configuration> 
    <system.serviceModel>   
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MetaBehaviour"> 
       <serviceMetadata /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="MetaBehaviour" name="WcfStreaming.LargeDataService"> 
      <clear /> 
      <endpoint address="net.tcp://localhost/LargeData" binding="netTcpBinding" 
       name="Tcp" contract="WcfStreaming.ILargeDataService" listenUriMode="Explicit" /> 
      <endpoint address="net.tcp://localhost/LargeData/mex" binding="mexTcpBinding" 
       name="TcpMex" contract="IMetadataExchange" listenUriMode="Explicit" /> 
      <endpoint address="http://localhost/wcfstreaming" binding="basicHttpBinding" 
       bindingConfiguration="" name="BasicHttp" contract="WcfStreaming.ILargeDataService" /> 
     </service> 
    </services> 
    </system.serviceModel> 
</configuration> 

这里是托管代码:

host = new ServiceHost(typeof(WcfStreaming.LargeDataService), 
      new Uri[] { HttpUri, TcpUri }); 

host.Open(); 

var factory = new ChannelFactory<WcfStreaming.ILargeDataService>(new NetTcpBinding(), new EndpointAddress(TcpUri)); // Hnew NetTcpBinding(), new EndpointAddress(TcpUri)); 

srvChannel = factory.CreateChannel(); 

using (OpenFileDialog dlg = new OpenFileDialog()) 
{ 
    if (dlg.ShowDialog() == DialogResult.OK) 
    { 
     Stream str = srvChannel.GetFile(dlg.FileName); //Exception here 

     StreamReader sr = new StreamReader(str); 
     string bf = sr.ReadToEnd(); 
     File.WriteAllText(@"C:\test", bf); 
    } 
} 

我变得肮脏:

此发送要求操作的net.tcp://localhost/LargeData在配置的超时(00:01:00)内未收到回复。分配给此操作的时间可能是超时时间的一部分。这可能是因为该服务仍在处理该操作,或者因为该服务无法发送回复消息。请考虑增加操作超时(通过将通道/代理强制转换为IContextChannel并设置OperationTimeout属性),并确保服务能够连接到客户端。

+0

尝试在服务器上启用跟踪,您可能会在跟踪中获得比客户端更好的异常。 – carlosfigueira

+0

好吧,你似乎在发送大量的数据,并且你的命名导致你相信你可能也想使用流式处理....也许超时时间太短了 - 你是否尝试增加例如超时3分钟(而不是1)? –

+0

我注意到,在VS下运行很好:内置的wcf客户端运行在.../mex上。那么我应该手动添加mex端点到servicehost吗? – Nickolodeon

回答

2

您可以通过在app.config文件(调用您的wcf服务,而不是wcf服务app.config文件)中放入以下内容来添加wcf跟踪。跟踪被倾倒出来到c:\ wcf.svclog

<system.diagnostics> 
     <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, Warning, ActivityTracing, Error, Critical" 
       propagateActivity="true"> 
      <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData= "c:\wcf.svclog" /> 
      </listeners> 
     </source> 
     </sources> 
    </system.diagnostics> 

而且如果VS下运行,而不是外面的话,就意味着你正在创建犯规匹配你的应用程序中定义的服务端点ServiceHost的。配置文件(再次调用wcf的项目的配置文件,而不是wcf的app.config文件)。或者servicehost实例化代码永远不会运行。

它运行在VS becasue VS默认情况下创建一个WCF调试主机,加载您的wcf服务并公开服务和MEX网址。有时如果您的应用程序崩溃,此调试帮助将继续运行。该进程是wcfsvchost.exe。

“Mex”允许您获取服务的元数据,因此最终程序不需要它。