คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ
Apigee X info
อะไร
สร้างข้อความที่กำหนดเองเพื่อตอบสนองต่อเงื่อนไขข้อผิดพลาด ใช้ RaiseFault เพื่อกำหนดการตอบกลับข้อผิดพลาดที่ส่งคืนไปยังแอปที่ขอเมื่อเกิดเงื่อนไขที่เฉพาะเจาะจง
ดูข้อมูลทั่วไปเกี่ยวกับการจัดการข้อบกพร่องได้ที่การจัดการข้อบกพร่อง
ตัวอย่าง
Return FaultResponse
ในการใช้งานที่พบบ่อยที่สุด จะใช้ RaiseFault เพื่อแสดงการตอบกลับข้อผิดพลาดที่กำหนดเองไปยัง
แอปที่ขอ ตัวอย่างเช่น นโยบายนี้จะแสดงรหัสสถานะ 404 โดยไม่มี
เพย์โหลด
<RaiseFault name="404">
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<FaultResponse>
<Set>
<StatusCode>404</StatusCode>
<ReasonPhrase>The resource requested was not found</ReasonPhrase>
</Set>
</FaultResponse>
</RaiseFault>เพย์โหลด FaultResponse ที่ส่งคืน
ตัวอย่างที่ซับซ้อนกว่านั้นเกี่ยวข้องกับการแสดงผลเพย์โหลดการตอบกลับข้อผิดพลาดที่กำหนดเอง พร้อมด้วยส่วนหัว HTTP และรหัสสถานะ HTTP ในตัวอย่างต่อไปนี้ การตอบกลับข้อผิดพลาดจะได้รับการป้อนข้อมูล ด้วยข้อความ XML ที่มีรหัสสถานะ HTTP ที่ Edge ได้รับจากบริการแบ็กเอนด์ และส่วนหัวที่มีประเภทข้อผิดพลาดที่เกิดขึ้น
<RaiseFault name="ExceptionHandler"> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <FaultResponse> <Set> <Payload contentType="text/xml"> <root>Please contact support@company.com</root> </Payload> <StatusCode>{response.status.code}</StatusCode> <ReasonPhrase>Server error</ReasonPhrase> </Set> <Add> <Headers> <Header name="FaultHeader">{fault.name}</Header> </Headers> </Add> </FaultResponse> </RaiseFault>
ดูรายการตัวแปรทั้งหมดที่ใช้ในการป้อนข้อมูล FaultResponse แบบไดนามิกได้ที่การอ้างอิง ตัวแปร
จัดการข้อผิดพลาดในการเรียกใช้บริการ
เกี่ยวกับนโยบาย RaiseFault
Apigee Edge ช่วยให้คุณจัดการข้อยกเว้นที่กำหนดเองได้โดยใช้นโยบายประเภท RaiseFault นโยบาย RaiseFault ซึ่งคล้ายกับ นโยบาย AssignMessage ช่วยให้คุณสร้างการตอบกลับข้อผิดพลาดที่กำหนดเองได้เมื่อเกิดข้อผิดพลาด
ใช้นโยบาย RaiseFault เพื่อกำหนดการตอบกลับข้อผิดพลาดที่จะแสดงต่อแอปที่ส่งคำขอ เมื่อเกิดข้อผิดพลาดที่เฉพาะเจาะจง การตอบกลับข้อผิดพลาดอาจประกอบด้วยส่วนหัว HTTP, พารามิเตอร์การค้นหา และเพย์โหลดข้อความ การตอบกลับข้อผิดพลาดที่กำหนดเองอาจมีประโยชน์ต่อนักพัฒนาแอป และผู้ใช้ปลายทางของแอปมากกว่าข้อความแสดงข้อผิดพลาดทั่วไปหรือโค้ดตอบกลับ HTTP
เมื่อดำเนินการ นโยบาย RaiseFault จะโอนการควบคุมจากโฟลว์ปัจจุบันไปยังโฟลว์ Error ซึ่งจะส่งการตอบกลับข้อผิดพลาดที่กำหนดไปยังแอปไคลเอ็นต์ที่ขอ จากนั้นเมื่อโฟลว์ข้อความ เปลี่ยนไปเป็นโฟลว์ข้อผิดพลาด จะไม่มีการประมวลผลนโยบายเพิ่มเติม ระบบจะข้ามขั้นตอนการประมวลผลที่เหลือทั้งหมด และส่งการตอบกลับข้อผิดพลาดไปยังแอปที่ขอ โดยตรง
คุณใช้ RaiseFault ใน ProxyEndpoint หรือ TargetEndpoint ได้ โดยปกติแล้ว คุณจะแนบเงื่อนไขกับ นโยบาย RaiseFault หลังจากที่ RaiseFault ทำงานแล้ว Apigee จะดำเนินการตามการประมวลผลข้อผิดพลาดปกติ ประเมิน FaultRules หรือหากไม่มีการกำหนดกฎข้อผิดพลาด ระบบจะสิ้นสุดการประมวลผล คำขอ
การอ้างอิงองค์ประกอบ
การอ้างอิงองค์ประกอบจะอธิบายองค์ประกอบและแอตทริบิวต์ของนโยบาย RaiseFault
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <RaiseFault async="false" continueOnError="false" enabled="true" name="Raise-Fault-1"> <DisplayName>RaiseFault 1</DisplayName> <FaultResponse> <AssignVariable> <Name/> <Value/> </AssignVariable> <Add> <Headers/> </Add> <Copy source="request"> <Headers/> <StatusCode/> <ReasonPhrase/> </Copy> <Remove> <Headers/> </Remove> <Set> <Headers/> <Payload/> <ReasonPhrase/> <StatusCode/> </Set> </FaultResponse> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </RaiseFault>
แอตทริบิวต์ <RaiseFault>
<RaiseFault async="false" continueOnError="false" enabled="true" name="Raise-Fault-1">
ตารางต่อไปนี้อธิบายแอตทริบิวต์ทั่วไปในองค์ประกอบระดับบนสุดของนโยบายทั้งหมด
| แอตทริบิวต์ | คำอธิบาย | ค่าเริ่มต้น | การมีบุคคลอยู่ |
|---|---|---|---|
name |
ชื่อภายในของนโยบาย ค่าของแอตทริบิวต์ (ไม่บังคับ) ใช้องค์ประกอบ |
ไม่มี | ต้องระบุ |
continueOnError |
ตั้งค่าเป็น ตั้งค่าเป็น |
เท็จ | ไม่บังคับ |
enabled |
ตั้งค่าเป็น ตั้งค่าเป็น |
จริง | ไม่บังคับ |
async |
แอตทริบิวต์นี้เลิกใช้งานแล้ว |
เท็จ | เลิกใช้ |
<DisplayName> องค์ประกอบ
ใช้เพิ่มเติมจากแอตทริบิวต์ name เพื่อติดป้ายกำกับนโยบายใน
เครื่องมือแก้ไขพร็อกซี UI การจัดการด้วยชื่อที่เป็นภาษาธรรมชาติต่างกัน
<DisplayName>Policy Display Name</DisplayName>
| ค่าเริ่มต้น |
ไม่มี หากไม่ใส่องค์ประกอบนี้ ค่าของแอตทริบิวต์ |
|---|---|
| การมีบุคคลอยู่ | ไม่บังคับ |
| ประเภท | สตริง |
องค์ประกอบ <IgnoreUnresolvedVariables>
(ไม่บังคับ) ละเว้นข้อผิดพลาดของตัวแปรที่ยังไม่ได้รับการแก้ไขในโฟลว์ ค่าที่ใช้ได้: จริง/เท็จ
ค่าเริ่มต้น true
องค์ประกอบ <FaultResponse>
(ไม่บังคับ) กำหนดข้อความตอบกลับที่ส่งคืนไปยังไคลเอ็นต์ที่ส่งคำขอ FaultResponse ใช้การตั้งค่าเดียวกับนโยบาย AssignMessage (ไม่พร้อมใช้งานใน Apigee Edge สำหรับ Private Cloud)
องค์ประกอบ <FaultResponse><AssignVariable>
กำหนดค่าให้กับตัวแปรโฟลว์ปลายทาง
หากไม่มีตัวแปรโฟลว์ AssignVariable จะสร้างตัวแปรดังกล่าว
ตัวอย่างเช่น ใช้โค้ดต่อไปนี้เพื่อตั้งค่าตัวแปรชื่อ myFaultVar
ในนโยบาย RaiseFault
<FaultResponse>
<AssignVariable>
<Name>myFaultVar</Name>
<Value>42</Value>
</AssignVariable>
...
</FaultResponse>จากนั้นคุณจะอ้างอิงตัวแปรนั้นในเทมเพลตข้อความได้ในภายหลังในนโยบาย RaiseFault นอกจากนี้ นโยบายที่แนบกับ FaultRule จะเข้าถึงตัวแปรได้ ตัวอย่างเช่น นโยบาย AssignMessage ต่อไปนี้ ใช้ตัวแปรที่ตั้งค่าไว้ใน RaiseFault เพื่อตั้งค่าส่วนหัวในการตอบกลับข้อผิดพลาด
<AssignMessage enabled="true" name="Assign-Message-1"> <Add> <Headers> <Header name="newvar">{myFaultVar}</Header> </Headers> </Add> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
<AssignVariable> ในนโยบาย RaiseFault จะใช้ไวยากรณ์เดียวกันกับองค์ประกอบ <AssignVariable> ในนโยบาย AssignMessage โปรดทราบว่าฟังก์ชันนี้
ยังไม่พร้อมใช้งานใน Apigee Edge สำหรับ Private Cloud
องค์ประกอบ <FaultResponse><Add>/<Headers>
เพิ่มส่วนหัว HTTP ลงในข้อความแสดงข้อผิดพลาด โปรดทราบว่าส่วนหัวที่ว่างเปล่า
<Add><Headers/></Add> จะไม่เพิ่มส่วนหัวใดๆ ตัวอย่างนี้คัดลอกค่าของตัวแปรโฟลว์ request.user.agent ไปยังส่วนหัว
<Add>
<Headers>
<Header name="user-agent">{request.user.agent}</Header>
</Headers>
</Add>|
ค่าเริ่มต้น: |
ไม่มี |
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
สตริง |
<FaultResponse><Copy> element
คัดลอกข้อมูลจากข้อความที่ระบุโดยแอตทริบิวต์ source ไปยังข้อความแสดงข้อผิดพลาด
<Copy source="request">
<Headers/>
<StatusCode/>
<ReasonPhrase/>
</Copy>|
ค่าเริ่มต้น: |
ไม่มี |
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
สตริง |
Attributes
<Copy source="response">
| แอตทริบิวต์ | คำอธิบาย | การมีบุคคลอยู่ | ประเภท |
|---|---|---|---|
| source |
ระบุออบเจ็กต์ต้นทางของการคัดลอก
|
ไม่บังคับ | สตริง |
องค์ประกอบ <FaultResponse><Copy>/<Headers>
คัดลอกส่วนหัว HTTP ที่ระบุจากแหล่งที่มาไปยังข้อความแสดงข้อผิดพลาด หากต้องการคัดลอกส่วนหัวทั้งหมด
ให้ระบุ <Copy><Headers/></Copy>.
<Copy source='request'>
<Headers>
<Header name="headerName"/>
</Headers>
</Copy>หากมีส่วนหัวหลายรายการที่มีชื่อเดียวกัน ให้ใช้ไวยากรณ์ต่อไปนี้
<Copy source='request'>
<Headers>
<Header name="h1"/>
<Header name="h2"/>
<Header name="h3.2"/>
</Headers>
</Copy>ตัวอย่างนี้จะคัดลอก "h1", "h2" และค่าที่ 2 ของ "h3" หาก "h3" มีค่าเพียงค่าเดียว ระบบจะไม่คัดลอก
|
ค่าเริ่มต้น: |
ไม่มี |
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
สตริง |
องค์ประกอบ <FaultResponse><Copy>/<StatusCode>
รหัสสถานะ HTTP ที่จะคัดลอกจากออบเจ็กต์ที่ระบุโดยแอตทริบิวต์แหล่งที่มาไปยังข้อความแสดงข้อผิดพลาด
<Copy source='response'>
<StatusCode>404</StatusCode>
</Copy>|
ค่าเริ่มต้น: |
เท็จ |
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
สตริง |
องค์ประกอบ <FaultResponse><Copy>/<ReasonPhrase>
คำอธิบายสาเหตุที่จะคัดลอกจากออบเจ็กต์ที่ระบุโดยแอตทริบิวต์แหล่งที่มาไปยังข้อความแสดงข้อผิดพลาด
<Copy source='response'>
<ReasonPhrase>The resource requested was not found.</ReasonPhrase>
</Copy>|
ค่าเริ่มต้น: |
เท็จ |
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
สตริง |
องค์ประกอบ <FaultResponse><Remove>/<Headers>
นำส่วนหัว HTTP ที่ระบุออกจากข้อความแสดงข้อผิดพลาด หากต้องการนำส่วนหัวทั้งหมดออก ให้ระบุ
<Remove><Headers/></Remove> ตัวอย่างนี้จะนำส่วนหัว user-agent ออกจากข้อความ
<Remove>
<Headers>
<Header name="user-agent"/>
</Headers>
</Remove>หากมีส่วนหัวหลายรายการที่มีชื่อเดียวกัน ให้ใช้ไวยากรณ์ต่อไปนี้
<Remove>
<Headers>
<Header name="h1"/>
<Header name="h2"/>
<Header name="h3.2"/>
</Headers>
</Remove>ตัวอย่างนี้จะนำ "h1", "h2" และค่าที่ 2 ของ "h3" ออก หาก "h3" มีค่าเพียงค่าเดียว ระบบจะไม่นำออก
|
ค่าเริ่มต้น: |
ไม่มี |
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
สตริง |
<FaultResponse><Set> element
ตั้งค่าข้อมูลในข้อความแสดงข้อผิดพลาด
<Set> <Headers/> <Payload> </Payload> <StatusCode/> <ReasonPhrase/> </Set>
|
ค่าเริ่มต้น: |
ไม่มี |
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
ไม่มี |
องค์ประกอบ <FaultResponse>/<Set>/<Headers>
ตั้งค่าหรือเขียนทับส่วนหัว HTTP ในข้อความแสดงข้อผิดพลาด โปรดทราบว่าส่วนหัวที่ว่างเปล่า
<Set><Headers/></Set> จะไม่ตั้งค่าส่วนหัวใดๆ ตัวอย่างนี้ตั้งค่าส่วนหัว user-agent เป็นตัวแปรข้อความที่ระบุด้วยองค์ประกอบ <AssignTo>
<Set>
<Headers>
<Header name="user-agent">{request.header.user-agent}</Header>
</Headers>
</Set>|
ค่าเริ่มต้น: |
ไม่มี |
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
สตริง |
องค์ประกอบ <FaultResponse>/<Set>/<Payload>
ตั้งค่าเพย์โหลดของข้อความแสดงข้อผิดพลาด
<Set> <Payload contentType="text/plain">test1234</Payload> </Set>
ตั้งค่าเพย์โหลด JSON
<Set> <Payload contentType="application/json"> {"name":"foo", "type":"bar"} </Payload> </Set>
ในเพย์โหลด JSON คุณสามารถแทรกตัวแปรโดยใช้แอตทริบิวต์ variablePrefix และ
variableSuffix ที่มีอักขระตัวคั่นดังที่แสดงในตัวอย่างต่อไปนี้
<Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo", "type":"@variable_name#"} </Payload> </Set>
หรือตั้งแต่เวอร์ชันคลาวด์ 16.08.17 เป็นต้นไป คุณยังใช้เครื่องหมายปีกกาเพื่อแทรกตัวแปรได้ด้วย
<Set> <Payload contentType="application/json"> {"name":"foo", "type":"{variable_name}"} </Payload> </Set>
ตั้งค่าเพย์โหลดแบบผสมใน XML
<Set> <Payload contentType="text/xml"> <root> <e1>sunday</e1> <e2>funday</e2> <e3>{var1}</e3> </Payload> </Set>
|
ค่าเริ่มต้น: |
|
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
สตริง |
Attributes
<Payload contentType="content_type" variablePrefix="char" variableSuffix="char">
| แอตทริบิวต์ | คำอธิบาย | การมีบุคคลอยู่ | ประเภท |
|---|---|---|---|
| contentType |
หากระบุ contentType ระบบจะกำหนดค่าให้กับส่วนหัว |
ไม่บังคับ | สตริง |
| variablePrefix | ระบุตัวคั่นนำหน้าในตัวแปรโฟลว์ (ไม่บังคับ) เนื่องจากเพย์โหลด JSON ไม่สามารถใช้อักขระ "{" เริ่มต้นได้ | ไม่บังคับ | Char |
| variableSuffix | ระบุตัวคั่นต่อท้ายในตัวแปรโฟลว์ (ไม่บังคับ) เนื่องจากเพย์โหลด JSON ไม่สามารถใช้อักขระ "}" เริ่มต้นได้ | ไม่บังคับ | Char |
องค์ประกอบ <FaultResponse>/<Set>/<StatusCode>
ตั้งค่ารหัสสถานะของการตอบกลับ
<Set source='request'>
<StatusCode>404</StatusCode>
</Set>|
ค่าเริ่มต้น: |
เท็จ |
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
บูลีน |
องค์ประกอบ <FaultResponse>/<Set>/<ReasonPhrase>
กำหนดวลีเหตุผลของการตอบกลับ
<Set source='request'>
<ReasonPhrase>The resource requested was not found.</ReasonPhrase>
</Set>|
ค่าเริ่มต้น: |
เท็จ |
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
บูลีน |
องค์ประกอบ <ShortFaultReason>
ระบุให้แสดงเหตุผลสั้นๆ ของข้อผิดพลาดในการตอบกลับ
<ShortFaultReason>true|false</ShortFaultReason>
โดยค่าเริ่มต้น เหตุผลที่ทำให้เกิดข้อผิดพลาดในการตอบกลับของนโยบายคือ
"fault":{"faultstring":"Raising fault. Fault name : Raise-Fault-1","detail":{"errorcode":"errorCode"}}}หากต้องการให้ข้อความอ่านง่ายขึ้น คุณสามารถตั้งค่าองค์ประกอบ <ShortFaultReason>
เป็น true เพื่อย่อ faultstring ให้เหลือเพียงชื่อนโยบายได้
"fault":{"faultstring":"Raise-Fault-1","detail":{"errorcode":"errorCode"}}}ค่าที่ใช้ได้: จริง/เท็จ(ค่าเริ่มต้น)
|
ค่าเริ่มต้น: |
เท็จ |
|
การแสดงตน: |
ไม่บังคับ |
|
ประเภท: |
บูลีน |
ตัวแปรโฟลว์
ตัวแปรโฟลว์ช่วยให้เกิดลักษณะการทำงานแบบไดนามิกของนโยบายและโฟลว์ในขณะรันไทม์ โดยอิงตามส่วนหัว HTTP เนื้อหาข้อความ หรือบริบทโฟลว์ ตัวแปรโฟลว์ที่กำหนดไว้ล่วงหน้าต่อไปนี้พร้อมใช้งาน หลังจากที่นโยบาย RaiseFault ทำงาน ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวแปรโฟลว์ได้ที่ข้อมูลอ้างอิงตัวแปร
| ตัวแปร | ประเภท | สิทธิ์ | คำอธิบาย |
|---|---|---|---|
| fault.name | สตริง | อ่านอย่างเดียว | เมื่อนโยบาย RaiseFault ทำงาน ระบบจะตั้งค่าตัวแปรนี้เป็นสตริง
RaiseFault เสมอ |
| fault.type | สตริง | อ่านอย่างเดียว | แสดงผลประเภทข้อบกพร่องในข้อผิดพลาด และหากไม่มี ให้แสดงผลสตริงว่าง |
| fault.category | สตริง | อ่านอย่างเดียว | แสดงผลหมวดหมู่ข้อบกพร่องในข้อผิดพลาด และหากไม่มี ให้แสดงผลสตริงว่าง |
ตัวอย่างการใช้ RaiseFault
ตัวอย่างต่อไปนี้ใช้เงื่อนไขเพื่อบังคับให้มี
queryparam ที่มีชื่อ zipcode ในคำขอขาเข้า หากไม่มี queryparam โฟลว์จะทำให้เกิดข้อผิดพลาดผ่าน RaiseFault ดังนี้
<Flow name="flow-1">
<Request>
<Step>
<Name>RF-Error-MissingQueryParam</Name>
<Condition>request.queryparam.zipcode = null</Condition>
</Step>
...
</Request>
...
<Condition>(proxy.pathsuffix MatchesPath "/locations") and (request.verb = "GET")</Condition>
</Flow><RaiseFault name='RF-Error-MissingQueryParam'> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <FaultResponse> <Set> <Payload contentType='application/json'>{ "error" : { "code" : 400.02, "message" : "invalid request. Pass a zipcode queryparam." } } </Payload> <StatusCode>400</StatusCode> <ReasonPhrase>Bad Request</ReasonPhrase> </Set> </FaultResponse> </RaiseFault>
ข้อมูลอ้างอิงข้อผิดพลาด
ส่วนนี้จะอธิบายรหัสข้อผิดพลาดและข้อความแสดงข้อผิดพลาดที่ส่งกลับและตัวแปรข้อบกพร่อง ที่ Edge ตั้งค่าไว้เมื่อนโยบายนี้ทริกเกอร์ข้อผิดพลาด ข้อมูลนี้มีความสำคัญต่อการทราบว่าคุณจะสร้างกฎความผิดพลาดเพื่อ จัดการกับข้อผิดพลาด ดูข้อมูลเพิ่มเติมได้ที่ สิ่งที่คุณต้องรู้เกี่ยวกับข้อผิดพลาดของนโยบายและ การจัดการข้อผิดพลาด
ข้อผิดพลาดเกี่ยวกับรันไทม์
ข้อผิดพลาดเหล่านี้อาจเกิดขึ้นเมื่อนโยบายทำงาน
| รหัสข้อผิดพลาด | สถานะ HTTP | สาเหตุ |
|---|---|---|
steps.raisefault.RaiseFault |
500 | ดูสตริงข้อผิดพลาด |
ข้อผิดพลาดในการทำให้ใช้งานได้
ไม่มี
ตัวแปรความผิดพลาด
ระบบจะตั้งค่าตัวแปรเหล่านี้เมื่อเกิดข้อผิดพลาดรันไทม์ โปรดดูข้อมูลเพิ่มเติมที่หัวข้อสิ่งที่คุณจำเป็นต้องทราบ เกี่ยวกับข้อผิดพลาดของนโยบาย
| ตัวแปร | สถานที่ | ตัวอย่าง |
|---|---|---|
fault.name="fault_name" |
fault_name คือชื่อของข้อผิดพลาดตามที่ระบุไว้ใน ตารางข้อผิดพลาดรันไทม์ด้านบน ชื่อข้อผิดพลาดเป็นชื่อสุดท้าย ของรหัสข้อผิดพลาด | fault.name = "RaiseFault" |
raisefault.policy_name.failed |
policy_name คือชื่อที่ผู้ใช้ระบุของนโยบาย เกิดความผิดพลาด | raisefault.RF-ThrowError.failed = true |
ตัวอย่างการตอบสนองข้อผิดพลาด
{ "fault":{ "detail":{ "errorcode":"steps.raisefault.RaiseFault" }, "faultstring":"Raising fault. Fault name: [name]" } }
สคีมา
นโยบายแต่ละประเภทกำหนดโดยสคีมา XML (.xsd) สคีมานโยบาย
มีอยู่ใน GitHub