WCF Service เพิ่มระยะหมดเวลาได้อย่างไร?


94

อาจดูเหมือนเป็นคำถามโง่ ๆ แต่ทุกอย่างใน WCF ดูเหมือนจะซับซ้อนกว่าใน asmx มากฉันจะเพิ่มระยะหมดเวลาของบริการ svc ได้อย่างไร

นี่คือสิ่งที่ฉันมีจนถึงตอนนี้:

<bindings>
      <basicHttpBinding>
        <binding name="IncreasedTimeout" 
          openTimeout="12:00:00" 
          receiveTimeout="12:00:00" closeTimeout="12:00:00"
          sendTimeout="12:00:00">
        </binding>
      </basicHttpBinding>
</bindings>

จากนั้นจุดสิ้นสุดของฉันจะถูกแมปเช่นนี้:

<endpoint address="" 
  binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
             contract="ServiceLibrary.IDownloads">
             <identity>
                <dns value="localhost" />
             </identity>
          </endpoint>

ข้อผิดพลาดที่ฉันได้รับ:

ช่องคำขอหมดเวลาระหว่างรอการตอบกลับหลัง 00: 00: 59.9990000 เพิ่มค่าการหมดเวลาที่ส่งไปยังการเรียกร้องขอหรือเพิ่มค่า SendTimeout บนการผูก เวลาที่กำหนดให้กับการดำเนินการนี้อาจเป็นส่วนหนึ่งของการหมดเวลาที่นานขึ้น

ในไคลเอนต์การทดสอบ WCF มีไอคอนกำหนดค่าที่มีการกำหนดค่ารันไทม์ของบริการของฉัน:

อย่างที่คุณเห็นมันไม่ใช่ค่าเดียวกับที่ฉันตั้งไว้? ผมทำอะไรผิดหรือเปล่า?

<bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>

คำตอบ:


180

ในการกำหนดค่าการเชื่อมโยงของคุณมีค่าการหมดเวลาสี่ค่าที่คุณสามารถปรับแต่งได้:

<bindings>
  <basicHttpBinding>
    <binding name="IncreasedTimeout"
             sendTimeout="00:25:00">
    </binding>
  </basicHttpBinding>

ที่สำคัญที่สุดคือข้อความsendTimeoutที่ระบุว่าลูกค้าจะรอการตอบกลับจากบริการ WCF ของคุณนานแค่ไหน คุณสามารถระบุhours:minutes:secondsในการตั้งค่าของคุณ - ในตัวอย่างของฉันฉันตั้งค่าการหมดเวลาเป็น 25 นาที

openTimeoutเป็นชื่อที่แสดงเป็นระยะเวลาที่คุณเต็มใจที่จะรอเมื่อคุณเปิดการเชื่อมต่อกับบริการ WCF ของคุณ ในทำนองเดียวกันcloseTimeoutคือระยะเวลาที่คุณปิดการเชื่อมต่อ (กำจัดไคลเอนต์พร็อกซี) ที่คุณจะรอก่อนที่จะมีข้อยกเว้นเกิดขึ้น

receiveTimeoutเป็นบิตเช่นกระจกสำหรับที่sendTimeout- ในขณะที่หมดเวลาส่งเป็นจำนวนเวลาที่คุณจะรอการตอบสนองจากเซิร์ฟเวอร์ที่receiveTimeoutเป็นจำนวนเวลาที่คุณจะให้ลูกค้าที่จะได้รับและประมวลผลการตอบสนองจากที่ เซิร์ฟเวอร์

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

นอกจากนี้ยังมี openTimeout, getTimeout และ closeTimeout เอกสาร MSDN ในผลผูกพันให้ข้อมูลเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้สำหรับ

เพื่อให้เข้าใจถึงความซับซ้อนทั้งหมดของ WCF ฉันขอแนะนำอย่างยิ่งให้คุณซื้อหนังสือ " Learning WCF " โดย Michele Leroux Bustamante:

การเรียนรู้ WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

และคุณยังใช้เวลาดูซีรีส์ screencast " WCF จากบนลงล่าง " 15 ตอน - ขอแนะนำ

สำหรับหัวข้อขั้นสูงเพิ่มเติมฉันขอแนะนำให้คุณดูหนังสือบริการWCF การเขียนโปรแกรมของ Juwal Lowy

การเขียนโปรแกรม WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg


ฉันพยายามเพิ่มส่วนการเชื่อมโยงไปยัง <system.serviceModel> ใน web.config แต่ตอนนี้เกิดข้อผิดพลาด .... ขั้นตอนเพิ่มเติมใด ๆ ที่ฉันพลาดไป ...
JL

ฉันยังเปลี่ยนปลายทางในบริการของฉันเป็น <endpoint address = "" binding = "IncreasedTimeout" - นี่เป็นสิ่งที่ผิดหรือไม่
JL.

ฉันคิดว่าฉันเข้าใจแล้ว - binding = "basicHttpBinding" bindingConfiguration = "IncreasedTimeout"
JL

แน่นอน - การเชื่อมโยงเป็นประเภทของโปรโตคอลที่คุณใช้ - basicHttp, wsHttp, netTcp การกำหนดค่าการเชื่อมโยงคือการกำหนดค่าที่คุณสร้างใน config เพื่อแก้ไขการหมดเวลา ฯลฯ
marc_s

ตลกดีแม้ว่าหลังจากทำสิ่งนี้แล้วยังคงได้รับข้อผิดพลาดการหมดเวลา Marc คุณช่วยให้ข้อมูลให้มากที่สุดได้ไหม
JL.

28

วิธีที่ดีที่สุดคือเปลี่ยนการตั้งค่าที่คุณต้องการในโค้ดของคุณ

ดูตัวอย่างด้านล่าง:

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}

นี่เป็นทางออกที่ดีกว่าแทนที่จะอัปเดตการกำหนดค่าเพื่อให้ฉันสามารถกำหนดค่าที่แตกต่างกันสำหรับการโทรและบริการที่แตกต่างกันขอบคุณมาก
Salim

26

ต้องตั้งค่าการกำหนดค่าการหมดเวลาที่ระดับไคลเอนต์ดังนั้นการกำหนดค่าที่ฉันตั้งไว้ใน web.config จึงไม่มีผลใด ๆ เครื่องมือทดสอบ WCF มีการกำหนดค่าของตัวเองและมีที่ที่คุณต้องตั้งค่าระยะหมดเวลา


1
ใช่ - โดยทั่วไปจะต้องตั้งค่าทั้งบนไคลเอนต์และเซิร์ฟเวอร์แม้กระทั่ง - เช่นในกรณีของ "inactivityTimeout" ในเซสชันและสิ่งต่างๆเช่นนั้น
marc_s

8
JL: คุณสามารถแสดงให้เห็นว่าคุณทำอะไรที่เลวร้ายได้หรือไม่? ฉันมีปัญหาเดียวกัน
Nick Kahn

หากคุณใช้ 'WCF Test Client' ให้คลิกขวาที่ 'Config File' ในแผนผังบริการจากนั้นคลิก 'Edit with SvcConfigEditor' และเปลี่ยนระยะหมดเวลาภายในการเชื่อมโยง
Radderz

4

มีข้อผิดพลาดเดียวกันเมื่อเร็ว ๆ นี้ แต่สามารถแก้ไขได้โดยตรวจสอบให้แน่ใจว่าได้ปิดการเรียกไคลเอ็นต์ wcf ทุกครั้ง เช่น.

WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();

หรือ

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}

10
อย่าใช้วิธีการ 'ใช้': omaralzabir.com/do-not-use-using-in-wcf-client
Alex Marshall

ในความคิดเห็นของomaralzabir.com/do-not-use-using-in-wcf-clientมีตัวอย่างวิธีการใช้งานusingในขณะที่ไม่ทิ้งวัตถุช่องที่ผิดพลาด นี่คือ blogger อื่นที่มีวิธีการอื่น ๆ เข้ากันได้กับusingบล็อก: erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper
Greg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.