การเพิ่มค่าการหมดเวลาในบริการ WCF


134

ฉันจะเพิ่มระยะหมดเวลาเริ่มต้นให้มากกว่า 1 นาทีในบริการ WCF ได้อย่างไร


สิ่งที่ไม่ชัดเจน แต่ฉันคิดว่าคุณกำลังถามเป็นนัยว่าเป็นไปได้หรือไม่ที่จะกำหนดค่าทางฝั่งเซิร์ฟเวอร์เพื่อหมดเวลาการโทรที่ใช้เวลาดำเนินการนานกว่าหนึ่งนาที เป็นไปไม่ได้
gravidThoughts

คำตอบ:


197

คุณหมายถึงฝั่งเซิร์ฟเวอร์หรือฝั่งไคลเอ็นต์?

สำหรับไคลเอนต์คุณต้องการปรับแอตทริบิวต์sendTimeoutขององค์ประกอบการเชื่อมโยง สำหรับการให้บริการคุณจะต้องการปรับReceiveTimeoutแอตทริบิวต์ของ elemnent ผูกพัน

<system.serviceModel>
  <bindings>
    <netTcpBinding>
      <binding name="longTimeoutBinding"
        receiveTimeout="00:10:00" sendTimeout="00:10:00">
        <security mode="None"/>
      </binding>
    </netTcpBinding>
  </bindings>

  <services>
    <service name="longTimeoutService"
      behaviorConfiguration="longTimeoutBehavior">
      <endpoint address="net.tcp://localhost/longtimeout/"
        binding="netTcpBinding" bindingConfiguration="longTimeoutBinding" />
    </service>
....

แน่นอนคุณต้องแมปจุดสิ้นสุดที่คุณต้องการกับการเชื่อมโยงนั้น ๆ


ฉันจะจับคู่การผูกโดยใช้ 'ชื่อการผูก' ภายในแท็กปลายทางได้อย่างไร
Blankman

นี้เป็นเพียงผิดreceiveTimeoutในความมุ่งมั่นที่ฝั่งเซิร์ฟเวอร์ควบคุมของความเกียจคร้านสำหรับผูกเซสชั่นตาม ตัวอย่างเช่นเซิร์ฟเวอร์จะไม่ใช้การตั้งค่านี้สำหรับการเชื่อมโยง HTTP พื้นฐาน คุณต้องหมดเวลาการประมวลผลฝั่งเซิร์ฟเวอร์ของคุณเองสำหรับ WCF
gravidThoughts

45

ภายใต้เมนูเครื่องมือใน Visual Studio 2008 (หรือ 2005 หากคุณติดตั้งสิ่งที่ถูกต้องของ WCF) จะมีตัวเลือกที่เรียกว่า 'WCF Service Configuration Editor'

จากตรงนั้นคุณสามารถเปลี่ยนตัวเลือกการผูกสำหรับทั้งไคลเอนต์และบริการหนึ่งในตัวเลือกเหล่านี้คือการหมดเวลา


เครื่องมือนี้เป็นวิธีที่ยอดเยี่ยมในการหลีกเลี่ยงข้อผิดพลาดเช่นการตัดองค์ประกอบผิดวิธีการสะกดคำ ฯลฯ โทรดีๆ!
markaaronky

ดูที่นี่สำหรับเครื่องมืออื่นในการเปิดไฟล์บันทึก: stackoverflow.com/a/34283667/187650
juFo

9

คุณสามารถเลือกได้สองวิธี:

1) ตามรหัสในไคลเอนต์

public static void Main()
{
    Uri baseAddress = new Uri("http://localhost/MyServer/MyService");

    try
    {
        ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService));

        WSHttpBinding binding = new WSHttpBinding();
        binding.OpenTimeout = new TimeSpan(0, 10, 0);
        binding.CloseTimeout = new TimeSpan(0, 10, 0);
        binding.SendTimeout = new TimeSpan(0, 10, 0);
        binding.ReceiveTimeout = new TimeSpan(0, 10, 0);

        serviceHost.AddServiceEndpoint("ICalculator", binding, baseAddress);
        serviceHost.Open();

        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();

    }
    catch (CommunicationException ex)
    {
        // Handle exception ...
    }
}

2) โดย WebConfig ในเว็บเซิร์ฟเวอร์

<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding openTimeout="00:10:00" 
                 closeTimeout="00:10:00" 
                 sendTimeout="00:10:00" 
                 receiveTimeout="00:10:00">
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

สำหรับรายละเอียดเพิ่มเติมโปรดดูเอกสารอย่างเป็นทางการ

การกำหนดค่าการหมดเวลาในการผูก

คลาส WSHttpBinding


8

การหมดเวลาที่แตกต่างกันหมายถึงสิ่งที่แตกต่างกัน เมื่อคุณทำงานกับไคลเอนต์ .. คุณอาจจะดู SendTimeout เป็นส่วนใหญ่ - ตรวจสอบข้อมูลอ้างอิงนี้ - คำอธิบายที่ยอดเยี่ยมและเกี่ยวข้อง: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread / 84551e45-19a2-4d0d-bcc0-516a4041943d /


0

นอกเหนือจากระยะหมดเวลาการเชื่อมโยง (ซึ่งอยู่ในTimespans) คุณอาจต้องใช้สิ่งนี้ด้วย นี่คือวินาที

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.