2011-01-14 59 views
4

通道中执行我看到的如何投射到一个代理如引用:添加operationtimeout到在代码

((IContextChannel)client.InnerChannel).OperationTimeout = new TimeSpan(0,0,240); 

设置一个operationtimeout但我使用客户= channelFactory.CreateChannel();

如何将频道投射到IContextChannel?我希望这是有道理的。我没有完全掌握WCF中的频道。

感谢

阿列克谢,

不知道如何实现你的建议。 在这段代码中,我将如何设置一个operationtimeout?

 try 
     { 
      Binding multipleTokensBinding = MultiAuthenticationFactorBinding.CreateMultiFactorAuthenticationBinding(); 
      System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); 
      EndpointAddress endpointaddress = new EndpointAddress(new Uri("https://justsomeservice"), EndpointIdentity.CreateDnsIdentity("someone.com")); 

      ChannelFactory<TransActionSvc.TransactionPortType> channelFactory = null; 
      TransActionSvc.TransactionPortType client = null; 

      channelFactory = new ChannelFactory<TransActionSvc.TransactionPortType>(multipleTokensBinding, endpointaddress); 
      BindingElementCollection elements = channelFactory.Endpoint.Binding.CreateBindingElements(); 
      elements.Find<SecurityBindingElement>().IncludeTimestamp = true; 

      channelFactory.Endpoint.Binding = new CustomBinding(elements); 

      channelFactory.Credentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.Root, X509FindType.FindBySerialNumber, "xxx"); 
      channelFactory.Credentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.CurrentUser, StoreName.Root, X509FindType.FindBySerialNumber, "xxx"); 

      channelFactory.Credentials.UserName.UserName = Properties.Settings.Default.UserName; 
      channelFactory.Credentials.UserName.Password = Properties.Settings.Default.Password; 

      TransActionSvc.fetchTranDataAsAttachmentRequest req = new WF_Prod_Svc.TransActionSvc.fetchTranDataAsAttachmentRequest(); 
      TransActionSvc.fetchTranDataAsAttachmentResponse res = new WF_Prod_Svc.TransActionSvc.fetchTranDataAsAttachmentResponse(); 
      TransActionSvc.FetchTranDataAsAttachmentRq_Type reqtype = new WF_Prod_Svc.TransActionSvc.FetchTranDataAsAttachmentRq_Type(); 
      TransActionSvc.FetchTranDataAsAttachmentRs_Type restype = new WF_Prod_Svc.TransActionSvc.FetchTranDataAsAttachmentRs_Type(); 
      TransActionSvc.EndpointReferenceType endpntref = new WF_Prod_Svc.TransActionSvc.EndpointReferenceType(); 

      XmlAttribute actionAttrib1 = doc.CreateAttribute("soapenv", "mustUnderstand", "http://schemas.xmlsoap.org/soap/envelope/"); 
      actionAttrib1.Value = "0"; 
      XmlAttribute actionAttrib2 = doc.CreateAttribute("xmlns"); 
      actionAttrib2.Value = "http://schemas.xmlsoap.org/ws/2003/03/addressing"; 
      XmlAttribute[] objAcctionAtrb = new XmlAttribute[2]; 
      objAcctionAtrb.SetValue(actionAttrib1, 0); 
      objAcctionAtrb.SetValue(actionAttrib2, 1); 

      TransActionSvc.AttributedURI action = new WF_Prod_Svc.TransActionSvc.AttributedURI(); 
      action.AnyAttr = objAcctionAtrb; 
      action.Value = "Transaction"; 

      TransActionSvc.AttributedURI messageid = new WF_Prod_Svc.TransActionSvc.AttributedURI(); 
      messageid.AnyAttr = objAcctionAtrb; 
      messageid.Value = System.Guid.NewGuid().ToString(); 

      TransActionSvc.AttributedURI to = new WF_Prod_Svc.TransActionSvc.AttributedURI(); 
      to.AnyAttr = objAcctionAtrb; 
      to.Value = "XGI"; 

      TransActionSvc.EndpointReferenceType endpointreference = new WF_Prod_Svc.TransActionSvc.EndpointReferenceType(); 
      TransActionSvc.ReferencePropertiesType referenceproperties = new WF_Prod_Svc.TransActionSvc.ReferencePropertiesType(); 

      if (Svc_Division.Parsed) { reqtype.division = Svc_Division.StringValue; } 
      try{reqtype.startDate = Convert.ToDateTime(Svc_StartDate.StringValue);} 
      catch (FormatException ex){LogMessageToFile("Invalid Start date. " + ex.Message);} 
      try{reqtype.endDate = Convert.ToDateTime(Svc_EndDate.StringValue);} 
      catch (FormatException ex){LogMessageToFile("Invalid End date. " + ex.Message);} 
      if (Svc_DateType.StringValue == "T") 
      { 
       reqtype.transactionDateType = TransActionSvc.TransactionDateType_Enum.TransactionDate; 
      } 
      else 
      { 
       reqtype.transactionDateType = TransActionSvc.TransactionDateType_Enum.PostingDate; 
      } 
      switch (Svc_TransType.StringValue) 
      { 
       case "OOP": 
        reqtype.transactionType = TransActionSvc.TransactionType_Enum.OOP; 
        break; 
       case "CHARGES": 
        reqtype.transactionType = TransActionSvc.TransactionType_Enum.CHARGES; 
        break; 
       default: 
        reqtype.transactionType = TransActionSvc.TransactionType_Enum.ALL; 
        break; 
      } 

      System.Xml.XmlElement companyid = doc.CreateElement("companyId"); 
      companyid.InnerText = Properties.Settings.Default.CompanyID; 
      System.Xml.XmlElement[] objectarray = new System.Xml.XmlElement[1]; 
      objectarray.SetValue(companyid, 0); 
      referenceproperties.Any = objectarray; 
      endpointreference.ReferenceProperties = referenceproperties; 

      req.Action = action; 
      req.MessageID = messageid; 
      req.To = to; 
      req.ReplyTo = endpointreference; 
      req.fetchTranDataAsAttachment = reqtype; 

      try 
      { 
       client = channelFactory.CreateChannel(); 

       //THIS DOES NOT WORK 
       client.OperationTimeout = new TimeSpan(0,10,0); 

       res = client.fetchTranDataAsAttachment(req); 
       if (res.fetchTranDataAsAttachmentResponse1.WFFaultList != null) 
       { 
        LogLine = string.Format("FaultCode({0});FaultType({1});FaultReason({2});Severity({3})", 
           res.fetchTranDataAsAttachmentResponse1.WFFaultList[0].faultCode, 
           res.fetchTranDataAsAttachmentResponse1.WFFaultList[0].faultType, 
           res.fetchTranDataAsAttachmentResponse1.WFFaultList[0].faultReasonText, 
           res.fetchTranDataAsAttachmentResponse1.WFFaultList[0].severity); 
       } 
       if (res.fetchTranDataAsAttachmentResponse1.attachment != null) 
       { 
        string attachFileName = res.fetchTranDataAsAttachmentResponse1.attachment.fileName; 
        byte[] filebytes = res.fetchTranDataAsAttachmentResponse1.attachment.binaryData.Value; 
        FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "..\\..\\" + res.fetchTranDataAsAttachmentResponse1.attachment.fileName, FileMode.CreateNew, FileAccess.Write, FileShare.None); 
        fs.Write(filebytes, 0, filebytes.Length); 
        fs.Close(); 
        DateTime EndReceive = DateTime.Now; 
        TimeSpan elapsed = EndReceive.Subtract(BeginReceive); 
        LogLine = string.Format("Arguments: [{0}]; FileName: {1}; FileSize: {2} bytes; ElapsedTime: {3} seconds", arguments.Trim(), attachFileName, filebytes.Length.ToString(), elapsed.TotalSeconds.ToString()); 
        LogMessageToFile(LogLine); 
       } 
      } 
      catch (CommunicationException ex1) 
      { 
       Abort((IChannel)client, channelFactory); 
       FaultException fe = null; 
       Exception tmp = ex1; 
       while (tmp != null) 
       { 
        fe = tmp as FaultException; 
        if (fe != null) 
        { 
         break; 
        } 
        tmp = tmp.InnerException; 
       } 
       if (fe != null) 
       { 
        string errmsg = string.Format("The server sent back a fault: {0}", fe.CreateMessageFault().Reason.GetMatchingTranslation().Text); 
        LogMessageToFile(errmsg); 
       } 
       else 
       { 
        string errmsg = string.Format("The request failed with exception: {0}", ex1.Message.ToString()); 
        LogMessageToFile(errmsg); 
       } 
      } 
      catch (TimeoutException) 
      { 
       Abort((IChannel)client, channelFactory); 
       string errmsg = string.Format("The request timed out "); 
       DateTime EndReceive = DateTime.Now; 
       TimeSpan elapsed = EndReceive.Subtract(BeginReceive); 
       LogLine = string.Format("Arguments: [{0}]; Exception: {1}; ElapsedTime: {2} seconds", arguments.Trim(), errmsg, elapsed.TotalSeconds.ToString()); 
       LogMessageToFile(LogLine); 
      } 
      catch (Exception ex) 
      { 
       Abort((IChannel)client, channelFactory); 
       string errmsg = string.Format("The request failed with unexpected exception: {0}", ex.Message.ToString()); 
       LogMessageToFile(errmsg); 
      } 
      finally 
      { 
       ((IChannel)client).Close(); 
       channelFactory.Close(); 
      } 
     } 
+0

编辑我的回复。请改正标题,因为您没有将ChannelFactory转换为任何内容... – 2011-01-14 21:59:12

+0

标题已更改。这更准确地描述它吗? – smarsha 2011-01-14 22:57:40

回答

9

,因为没有一点工厂实现任何通道接口的你将不会被铸造通道工厂到信道接口得到任何usefuls(非空/非异常)的结果。

您可以将频道投射到其他频道界面,并且如果您知道使用哪种类型的频道(如您所参考的代码中),则可能会获得有用的结果。

编辑:我认为((IContextChannel)channel).OperationTimeout = new TimeSpan(0,10,0);应该工作。

注意:您的帖子标题与您的代码不匹配...