2011-01-14 26 views
4

で実装チャネルへ:operationtimeoutを設定するoperationtimeout追加は、私のようなプロキシにキャストする方法についての言及見てきたコード

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

を私は= channelFactory.CreateChannel()クライアントを使用しています。

チャネルをIContextChannelにキャストするにはどうすればよいですか?私はこれが理にかなってほしい。私はWCFのチャンネルを完全に把握していません。

おかげ

アレクセイ、

あなたの提案を実装する方法がわかりません。 このコードでは、どのように操作タイムアウトを設定しますか?チャネルインターフェイスのいずれかを実装する工場のためのポイントがないので

 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を何かにキャストしていないのでタイトルを修正してください... –

+0

Title Changed。それはより正確にそれを記述しますか? – smarsha

答えて

9

あなたは、インターフェイスをチャネルするチャネルファクトリをキャストすることによって任意のusefuls(非ヌル/非例外)の結果を得ることはありません。

チャンネルを他のチャンネルインターフェイスにキャストすることができ、あなたが参照しているコードのように使用されているチャンネルの種類がわかっていると便利な結果になる可能性があります。

編集:私は((IContextChannel)channel).OperationTimeout = new TimeSpan(0,10,0);がうまくいくはずだと思います。

注:あなたの投稿のタイトルはあなたのコードと一致しません。

+0

ありがとうアレクセイ。それが私の必要なものでした。とても有難い。 – smarsha

+0

私はIContextChannelにキャストすることについて知らなかった。私は数ヶ月前にタイムアウトを探していて、あきらめました。ありがとう! – rocketsarefast

+1

+1バインディングにも 'ReceiveTimeout'を設定する必要がありました – Andomar

関連する問題