เกี่ยวกับปัญหาเมื่อมีการเรียกใช้บริการเว็บที่เขียนด้วย C# ภายใต้ Delphi
ก่อนอื่น ฉันคิดว่าจำเป็นต้องให้คำอธิบายที่ครอบคลุมเกี่ยวกับการพัฒนาบริการเว็บภายใต้แพลตฟอร์ม .net การสร้างเว็บเซอร์วิสยุคแรกเริ่มปรากฏในสภาพแวดล้อมอีคอมเมิร์ซ ปัญหาบางอย่างไม่ง่ายที่จะแก้ไขด้วยวิธีดั้งเดิมอีกต่อไป เช่นในแอปพลิเคชัน สำหรับการสื่อสารทางธุรกิจและการแลกเปลี่ยนข้อมูล ไม่สามารถใช้กลไกไบนารี่ เช่น dcom และ corba อีกต่อไป ไม่ต้องพูดถึงว่ากลไกเหล่านี้ถูกจำกัดโดยแพลตฟอร์มที่เกี่ยวข้อง ตัวอย่างเช่น dcom (กระจายโมเดลอ็อบเจ็กต์ทั่วไป) สามารถทำได้ภายใต้แพลตฟอร์ม windows เท่านั้นในขณะที่ corba (นายหน้าร้องขอวัตถุทั่วไป สถาปัตยกรรม) เป็นเพียงผลิตภัณฑ์ของแพลตฟอร์มจาวาเท่านั้น เป็นเรื่องยากสำหรับพวกเขาที่จะบรรลุการสื่อสารข้อมูลระหว่างแอปพลิเคชัน
ในบริบทนี้ บริการทางเว็บจะเกิดขึ้นตามเวลาที่ต้องการ ซึ่งเป็นทางออกที่ดีสำหรับการรุกข้ามภาษา ข้ามแพลตฟอร์ม และการเจาะระบบไฟร์วอลล์ขององค์กรที่ดีและปลอดภัย โดยทั่วไปสถาปัตยกรรมจะแบ่งออกเป็น 5 ระดับ:
การสื่อสารข้อมูลภายใต้ช่องทาง http (hypertext transfer protocol)
แบบฟอร์มนิพจน์ข้อมูล xml (ภาษามาร์กอัปที่ขยายได้)
การห่อหุ้มข้อมูลของสบู่ (โปรโตคอลการเข้าถึงวัตถุอย่างง่าย)
รูปแบบภาษาคำอธิบายของ wsdl (ภาษาคำอธิบายบริการเว็บ)
uddi (คำอธิบายสากลและการรวมการค้นพบ) คำอธิบายแบบรวม การค้นพบ และการรวมเข้าด้วยกัน
การเป็นข้ามภาษา ข้ามแพลตฟอร์ม และดีและปลอดภัยในการเจาะไฟร์วอลล์ขององค์กรก็เพียงพอแล้วที่ทำให้เราตื่นเต้น อย่างไรก็ตาม ยังมีส่วนที่ต้องปรับปรุง เช่น:
การสื่อสารข้อมูล HTTP ช้า โดยเฉพาะการเชื่อมต่อครั้งแรก
ต้องการค่าใช้จ่ายเพิ่มเติมของเว็บเซิร์ฟเวอร์
หลังจากพูดถึงสถาปัตยกรรมของเว็บเซอร์วิส รวมถึงข้อดีและข้อเสียแล้ว เรามาถึงประเด็นซึ่งเป็นหัวข้อที่เราพูดคุยกันในครั้งนี้:
ปัญหาเมื่อมีการเรียกใช้บริการบริการเว็บภายใต้ Delphi
เพื่อเป็นการไม่ให้เสียเวลา เราจะมาอธิบายด้วยตัวอย่างง่ายๆ ของการทดสอบคุณลักษณะของ webmethod: มันเป็นกระบวนการทางธุรกิจง่ายๆ ในการโอนจากลูกค้า a ไปยังลูกค้า b
ขั้นแรกเราสร้างบริการเว็บภายใต้ .net framework1.1 ในขณะนี้ .net จะสร้างเว็บแอปพลิเคชันให้เราโดยอัตโนมัติ
เราจำเป็นต้องสร้าง class แอททริบิวต์ ซึ่งอยู่ภายใต้การทดสอบแอตทริบิวต์เนมสเปซ จากนั้นคลาสนี้จะสืบทอดคลาสพื้นฐาน system.web.services.webservice โดยอัตโนมัติ เมื่อจำเป็น เราสามารถตั้งค่าคลาสแอปพลิเคชันเว็บของมัน คุณลักษณะบริการพื้นฐานประกอบด้วยคำอธิบาย และเนมสเปซ
[แอตทริบิวต์บริการเว็บ (namespace=http://www.isdoo.com/services,
description=สวัสดีแอนเซล นี่คือบริการเว็บทดสอบ!)]
การทดสอบแอตทริบิวต์คลาสสาธารณะ: system.web.services.webservice
-
[webmethodattribute(description=Description information: สืบทอดวิธีการนับและโอเวอร์โหลดชื่อ การดำเนินการคือการโอนเงินจากผู้ใช้ a ไปยังผู้ใช้ b...,
//messagename=เปลี่ยนชื่อข้อความ
การตอบสนองบัฟเฟอร์ = จริง
ระยะเวลาแคช=1,000,
ช่วยให้เซสชั่น = จริง
Transactionoption=transactionoption.requiresnew)]
transmoney สตริงสาธารณะ (เงินสองเท่า)
-
พยายาม
-
contextutil.enablecommit();//transaction ใช้สำหรับการทำงานของฐานข้อมูลเท่านั้น!
เงินอินโทอา(เงิน);
moneyoutfromb(เงิน);
contextutil.setcomplete();
ส่งคืนธุรกรรมสำเร็จ รวม +money.tostring();
-
จับ (ยกเว้น e)
-
contextutil.setabort();
ธุรกรรมการส่งคืนล้มเหลว! /n/r +e.message;
-
-
โมฆะ moneyintoa ส่วนตัว (เงินสองเท่า)
-
sqlcommand sqlcom = คำสั่ง sql ใหม่ (อัพเดตชุดงบประมาณ money=money++money.tostring()+ โดยที่ name='a');
การเข้าถึงฐานข้อมูล mydatabase = การเข้าถึงฐานข้อมูลใหม่ ();
sqlcom.connection=mydatabase.getconnection();
sqlcom.connection.open();
sqlcom.executenonquery();
sqlcom.connection.close();
// โยนข้อยกเว้นใหม่ (การดำเนินการล้มเหลวเมื่อโอนเงินเข้า!);
-
โมฆะเงินส่วนตัว outfromb (เงินสองเท่า)
-
sqlcommand sqlcom = คำสั่ง sql ใหม่ (อัพเดตชุดงบประมาณ money=money-+money.tostring()+ โดยที่ name='b');
การเข้าถึงฐานข้อมูล mydatabase = การเข้าถึงฐานข้อมูลใหม่ ();
sqlcom.connection=mydatabase.getconnection();
sqlcom.connection.open();
sqlcom.executenonquery();
sqlcom.connection.close();
// โยนข้อยกเว้นใหม่ (การดำเนินการล้มเหลวเมื่อโอนเงินจาก b!);
-
-
สิ่งที่เราต้องให้ความสนใจเป็นพิเศษคือ webmethodattribute ซึ่งเป็นจุดสำคัญของสิ่งที่เราต้องพูดถึงในครั้งนี้ ตราบใดที่คุณเพิ่ม [webmethodattribute] ให้กับวิธีการ แม้ว่าจะไม่มีแอตทริบิวต์อยู่ในนั้นก็ตาม แสดงว่าบริการเว็บ จะเปิดเผยวิธีการนี้แก่ผู้เรียกเซ็กเมนต์ของลูกค้า เรามาพูดถึงคุณลักษณะ 6 รายการด้านล่าง รวมถึงคุณลักษณะข้อมูลเชิงพรรณนา 2 รายการและคุณลักษณะการทำงาน 4 รายการ
คุณลักษณะข้อมูลเชิงพรรณนา:
คำอธิบาย
ชื่อข้อความ
คุณสมบัติการใช้งาน 4 ประการ:
การตอบสนองบัฟเฟอร์
ระยะเวลาแคช
การเปิดใช้งาน
ตัวเลือกการทำธุรกรรม
ในหมู่พวกเขาเราต้องใส่ใจกับแอตทริบิวต์ messagename เมื่อ Delphi เรียกใช้บริการเว็บที่พัฒนาภายใต้แพลตฟอร์ม .net หากคุณตั้งค่าแอตทริบิวต์ messagename ข้อผิดพลาดจะถูกรายงานเมื่อไคลเอ็นต์เรียกใช้ นี่อาจเป็นข้อผิดพลาด บางทีเวอร์ชันที่ใหม่กว่าจะช่วยแก้ปัญหานี้ได้ สำหรับฟังก์ชันเฉพาะของคุณลักษณะเหล่านี้ จะไม่อธิบายรายละเอียดไว้ที่นี่ คุณสามารถอ่านหนังสือที่เกี่ยวข้องได้
ด้านล่างนี้ฉันจะแสดงรายการขั้นตอนเพื่อให้ Delphi เรียกใช้บริการเว็บ:
ก่อนอื่น หากคุณเพิ่งพัฒนาและโทรหาไคลเอนต์ คุณเพียงแค่ต้องสร้างแอปพลิเคชันธรรมดาเท่านั้น จากนั้นสิ่งที่คุณต้องทำคือค้นหาตัวควบคุม Soaphttpclient ใต้เว็บเซอร์วิสของแถบเครื่องมือ จากนั้นจึงวางลงในเนื้อหาหน้าต่างแอปพลิเคชันไคลเอนต์ของคุณ ;
ประการที่สอง คุณต้องตั้งค่า url แอตทริบิวต์หรือ wsdl ของ soaphttpclient นี้ เนื้อหานี้คือที่อยู่บริการของบริการเว็บของคุณ
ตัวอย่างเช่น ที่อยู่บริการในตัวอย่างปัจจุบันของเราคือ: http://localhost/attributetesting/attributetesting.asmx
หากคุณต้องการป้อน wsdl ก็คือ http://localhost/attributetesting/attributetesting.asmx?wsdl
นี่เป็นการสิ้นสุดการตั้งค่าการควบคุม
จากนั้นเราจำเป็นต้องนำเข้า wsdl ฝั่งเซิร์ฟเวอร์ คุณสามารถทำได้ด้วยตนเองหรือใช้ฟังก์ชันตัวนำเข้าบริการเว็บที่ Delphi จัดให้
สุดท้าย คุณเพียงแค่ต้องเรียกอินเทอร์เฟซ wsdl ที่นำเข้าเท่านั้น รหัสที่เกี่ยวข้องของเราที่นี่คือ:
ขั้นตอน tform1.bitbtn1click (ผู้ส่ง: tobject);
var
aa:attributetestsoap;//นี่คือคลาสอินเตอร์เฟสวัตถุภายใต้ wsdl
ผงชูรส: widestring;
บีบี:ดับเบิ้ล;
เริ่ม
//httprio2 จริงๆ แล้วเป็นคลาสพร็อกซีที่เรียกว่า ซึ่งมีหน้าที่ในการส่งข้อมูล ส่งคำขอ และยอมรับการตอบกลับ
aa:=httprio2 เป็นแอตทริบิวต์ testsoap;
บีบี:=100.00;
msg:=aa.transmoney(bb);//นี่คือวิธีบริการเว็บที่ webmethod เปิดเผยให้เราทราบโดยการเรียกบริการเว็บ
แสดงข้อความ(ผงชูรส);
จบ;
โอเค แค่นั้นแหละ!
การดาวน์โหลดซอร์สโค้ดเชิงพาณิชย์ยอดนิยม www.html.org.cn