2016-08-14 14 views
6

Tôi đang sử dụng ứng dụng khách dịch vụ web bên thứ ba (được tạo bằng cách sử dụng "Thêm tham chiếu dịch vụ") để truy xuất một số dữ liệu.Cách sắp xếp một đối tượng thành chuỗi xml với tiêu đề

Sau khi điền các đối tượng dịch vụ web với dữ liệu thích hợp chúng ta cần thêm một số dữ liệu để các tiêu đề (mật khẩu mã hóa và một số dữ liệu được xác định trước kia)

Sau đó, chúng ta đang serializing mọi yêu cầu gửi đến dịch vụ web, sử dụng tiêu chuẩn .net XmlSerializer.

Tuy nhiên, trong kết quả của việc tuần tự hóa, tôi không thấy tiêu đề của yêu cầu. Tôi đã tìm kiếm một thời gian dài và không thể tìm thấy bất kỳ cách nào để "in" chúng là tốt.

Dưới đây là một số mã ví dụ:

Ibooking proxy = new BookingManager(); 

/* Init proxy Data...*/ 
GetAvailabilityRequest request = new GetAvailabilityRequest(); 

/*Fill more data on the request...*/ 
GetAvailabilityResponse response = proxy.GetAvailability(request); //Send request to the web service 
var xmlString2 = response.Serialize(); //only body, no headers in the XML 


/* Extension class to Serialize any object */ 
public static class ExtensionUtil 
{ 
    public static string Serialize<T>(this T value) 
    { 
     try 
     { 
      XmlSerializer xmlserializer = new XmlSerializer(typeof(T)); 
      var stringWriter = new StringWriter(); 
      using (var writer = XmlWriter.Create(stringWriter)) 
      { 
       xmlserializer.Serialize(writer, value); 
       return stringWriter.ToString(); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception("An error occurred", ex); 
     } 
    } 
} 

tôi đã loại trừ mã sẽ thêm nhiều dữ liệu hơn để yêu cầu vì nó dài và phức tạp (cần phải thực hiện IEndpointBehaviorIClientMessageInspector để "bắt" các yêu cầu trước khi chúng tôi gửi nó) - nhưng hiện nay như một workaround tôi đặt một BreakPoint trên đối tượng tin nhắn và chuyển đổi nó thành chuỗi bằng cách sử dụng Visual Studio. Bằng cách này, tôi thấy các tiêu đề nhưng rõ ràng đây là thực hành không tốt vì tôi muốn nó được tự động hóa trong tuần tự hóa.

+0

Bạn có muốn xem tiêu đề trên Yêu cầu hoặc phản hồi không? – sachin

+0

yêu cầu là quan trọng hơn, nhưng kể từ cuối cùng tôi đang serializing chúng cả (yêu cầu và phản ứng xml được tạo ra) tôi muốn khả năng nhìn thấy tiêu đề cho cả hai người trong số họ – Dardar

+0

Không thực sự rõ ràng những gì đang xảy ra. Nhưng tôi có thể cho bạn biết XmlSerializer là rác. Hãy thử sử dụng NetDataContractSerializer, và chắc chắn rằng lớp được serialized được đánh dấu với DataContract và các thuộc tính được serialized được đánh dấu với các thuộc tính DataMember. – Will

Trả lời

0

Tôi muốn xem ví dụ về cách bạn thêm các tiêu đề này.

Trong hầu hết các dịch vụ web, nội dung thư là phần được tuần tự hóa thành XML hoặc JSON - các tiêu đề không phải là.

Bạn có thể kiểm tra cuộc gọi dịch vụ bằng cách sử dụng Fiddler và proxy được thực hiện bởi một thay đổi nhỏ trong web.config của bạn như được mô tả trong bài viết này: http://weblog.west-wind.com/posts/2008/Mar/14/Debugging-Http-or-Web-Services-Calls-from-ASPNET-with-Fiddler.

Các phiên bản ngắn của việc này là để thêm dòng sau vào web.config hoặc app.config của bạn:

<system.net> 
     <defaultProxy> 
      <proxy proxyaddress="http://127.0.0.1:8888" />  
     </defaultProxy> 
    </system.net> 

Tải về và chạy Fiddler khi gọi dịch vụ và bạn sẽ thấy và có thể kiểm tra các cuộc gọi trong Fiddler.

Nếu bạn muốn kiểm tra và/hoặc sửa đổi các tiêu đề trong cơ sở mã của bạn có thể xem xét triển khai IClientMessageInspector hoặc IDispatchMessageInspector. Dưới đây là một vài bài viết về chủ đề này:

https://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector(v=vs.100).aspx http://weblogs.asp.net/paolopia/writing-a-wcf-message-inspector

Đây là một thực hiện tôi đã làm. Tôi không cần truy cập các tiêu đề, mà là sửa đổi các không gian tên xml được tạo bởi trình khách dịch vụ, nhưng nó sẽ cung cấp cho bạn một ý tưởng về cách thực hiện: How can I create custom XML namespace attributes when consuming a legacy SOAP service?

0

OperationContext là bạn của bạn ở đây. Sử dụng một OperationContextScope để bọc các cuộc gọi đến dịch vụ, sau đó sử dụng OperationContext.Current để có được tất cả các goodies ẩn mà bạn cần.

https://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontextscope(v=vs.110).aspx

Lưu ý rằng bạn sẽ cần phải biết loại cụ thể của các tiêu đề mà bạn muốn để có được ít, và tôi đã có một số sự cố khi nhận tại các giá trị, chứ không phải chỉ là tên, tiêu đề nếu chúng không được đánh dấu là có thể tuần tự hóa khi sử dụng XmlSerializer

Các vấn đề liên quan