2013-06-17 18 views
5

Tôi đang cố tích hợp một ứng dụng với dịch vụ web của bên thứ ba. Chữ ký của phương thức tôi phải gọi là một cái gì đó như thế này (được tạo bởi máy phát proxy của VS):Gọi một dịch vụ web từ C# và gửi không thoát xml

string MyFoo(string param1, string param2, string param3, string someXml) 

Bây giờ cho 3 tham số đầu tiên không có vấn đề gì. Tham số thứ tư, theo quy cách nhà cung cấp, nên chứa "xml unescaped bọc trong một khối CDATA", như thế này:

<![CDATA[<?xml version="1.0" encoding="utf-8"?><rootNode></rootNode>]]> 

Bây giờ, C# thoát (như tôi mong chờ nó để làm) tất cả các nhân vật đó phải trốn thoát, chủ yếu là "<" và ">" nhân vật, thậm chí trong báo cáo CDATA, dẫn đến một cái gì đó như thế này:

&lt;![CDATA[&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;rootNode&gt;&lt;/rootNode&gt;]]&gt; 

theo như tôi biết điều này là một hành vi chính xác, và không có cách nào để ghi đè lên nó , vì nó có khả năng có thể tạo ra một yêu cầu xấu (thông điệp xà phòng không hợp lệ) và thậm chí là một vấn đề bảo mật.

Có ai biết nếu tôi đang bỏ lỡ điều gì đó, không biết điều gì đó hoặc điều này đúng và mong đợi của dịch vụ web của bên thứ ba không thể tuân thủ?

Cảm ơn.

Trả lời

1

Tôi đã không quan tâm đến vấn đề tương tự trong> 2 ngày kể từ hôm nay. Giải pháp khả thi duy nhất có hiệu quả đối với tôi là viết cho khách hàng dịch vụ (một giao diện và thực hiện ứng dụng khách). Điều này sẽ là vấn đề nếu dịch vụ của bạn thay đổi theo thời gian (bạn sẽ không thể tạo/cập nhật ứng dụng của mình với 3 lần nhấp chuột). Hãy để tôi nói những gì tôi đã làm.

đơn giản và công thức nấu ăn nhanh:

  1. sao chép giao diện khách hàng dịch vụ được tạo ra và đặt tên cho nó một cái gì đó giống như IServiceClientExtended;
  2. trong giao diện đó thay đổi tham số someXml thành XmlCDataSection someXml;
  3. trong MyFoo phương pháp thuộc tính thay đổi XmlSerializerFormatAttribute.Use-System.ServiceModel.OperationFormatUse.Literal từ System.ServiceModel.OperationFormatUse.Encoded;
  4. Xóa GeneratedCodeAttribute từ đó IServiceClientExtended thuộc tính nếu bạn không làm điều đó;
  5. Tạo ServiceClient lớp (bạn có thể sao chép nó từ được tạo) và thay đổi giao diện mà nó triển khai và kế thừa thành ClientBase, IServiceClientExtended;
  6. Tạo tất cả các phương pháp cần thiết (hoặc sao chép nó từ tạo ra) và phương pháp thay đổi chữ ký cho phù hợp mà IServiceClientExtended giao diện (someXml nên XmlCDataSection, nhớ không?);
  7. Trong code của bạn, sử dụng đã tạo ra ServiceClient lớp học của bạn với thông số someXml chuyển đổi sang XmlCDataSection. Bạn có thể làm điều đó như sau:
XmlDocument doc = new XmlDocument(); 
var section = doc.CreateCDataSection(someXmlString); 
string result = client.MyFoo(param1, param2, param3, section); 
0

V. Kasparavičius là đúng. Nhưng nó rất đơn giản, điều này chỉ cần một chút thay đổi trong Reference.cs. Loại thông số cần phải được thay đổi từ string thành XmlCDataSection.

private XmlCDataSection foo; 

[System.Xml.Serialization.XmlElementAttribute(Order=2)] 
public XmlCDataSection foo { 
    get { 
     return this.foo; 
    } 
    set { 
     this.foo = value; 
     this.RaisePropertyChanged("foo"); 
    } 
} 

Và sau đó thêm các thông số như XmlCDataSection

var xmlDocument = new XmlDocument(); var parameter = xmlDocument.CreateCDataSection("<foo></foo>");