2010-04-06 26 views

Trả lời

11

Một thay thế cho SoapExtensions là thực hiện IHttpModule và lấy dòng đầu vào như nó đến trong.

public class LogModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += this.OnBegin; 
    } 

    private void OnBegin(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 
     HttpContext context = app.Context; 

     byte[] buffer = new byte[context.Request.InputStream.Length]; 
     context.Request.InputStream.Read(buffer, 0, buffer.Length); 
     context.Request.InputStream.Position = 0; 

     string soapMessage = Encoding.ASCII.GetString(buffer); 

     // Do something with soapMessage 
    } 

    public void Dispose() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+2

lẽ hiển nhiên, nhưng bạn có thể cần phải đăng ký IHttpModule trong web.config

1

tôi giả sử bạn đang muốn đăng nhập theo yêu cầu SOAP để truy tìm; có lẽ bạn có một người tiêu dùng dịch vụ của bạn đang nói với bạn rằng họ đang gửi cho bạn SOAP tốt, nhưng bạn không tin họ, phải không?

Trong trường hợp đó, bạn nên (tạm thời) enable trace logging on your service.

Nếu bạn đang cố gắng ghi nhật ký mục đích chung, đừng bận tâm với gói SOAP vì nó nặng; nhật ký của bạn sẽ tăng lên nhanh chóng. Chỉ cần đăng nhập những nội dung quan trọng, ví dụ: "Thêm được gọi, X = foo, Y = bar".

+1

Rất tiếc, nó cần phải là vĩnh viễn, vì vậy tôi không thể bật theo dõi tạm thời. –

+0

@bangoker: Mặc dù bạn đã tìm thấy giải pháp đáp ứng nhu cầu trước mắt của mình, tôi khuyên bạn nên cân nhắc lại khóa học của mình. Ghi nhật ký mọi yêu cầu SOAP là nặng và cực kỳ không cần thiết. – Randolpho

6

Có, bạn có thể làm điều đó bằng cách sử dụng SoapExtensions. Đây là nice article chạy qua quy trình.

+0

Tôi nghĩ đó là điều tôi đang tìm kiếm, cảm ơn! –

+4

Liên kết bị hỏng. – wRAR

+0

Bỏ dấu là câu trả lời từ các liên kết bị phá vỡ –

5

Bạn cũng có thể đọc các contents of the Request.InputStream.

Cách này hữu ích hơn như đối với các trường hợp khi bạn muốn thực hiện xác thực hoặc các hành động khác trong WebMethod tùy thuộc vào nội dung của đầu vào.

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Xml; 
using System.IO; 
using System.Text; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

namespace SoapRequestEcho 
{ 
    [WebService(
    Namespace = "http://soap.request.echo.com/", 
    Name = "SoapRequestEcho")] 
    public class EchoWebService : WebService 
    { 

    [WebMethod(Description = "Echo Soap Request")] 
    public XmlDocument EchoSoapRequest(int input) 
    { 
     // Initialize soap request XML 
     XmlDocument xmlSoapRequest = new XmlDocument(); 

     // Get raw request body 
     Stream receiveStream = HttpContext.Current.Request.InputStream 

     // Move to begining of input stream and read 
     receiveStream.Position = 0; 
     using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8)) 
     { 
     // Load into XML document 
     xmlSoapRequest.Load(readStream); 
     } 

     // Return 
     return xmlSoapRequest; 
    } 
    } 
} 

LƯU Ý: cập nhật để phản ánh Johns bình luận dưới đây.

+0

Bạn đã thử mã này chưa? Trong số những thứ khác, tôi không nghĩ rằng bạn nên có 'sử dụng' khối, kể từ khi bạn không tạo ra' Stream'. 'StreamReader' cũng không nên ở trong khối' using', vì việc xử lý nó cũng sẽ đóng luồng và luồng không thuộc về bạn. Tôi cũng đặt câu hỏi liệu điều này sẽ tương thích với bất kỳ 'SoapExtension' nào mà sau này có thể được cấu hình hay không. –

+0

Vâng, tôi đã thử và hoạt động tốt (thử nhấp vào liên kết), như để sử dụng hoặc không sử dụng, nó chỉ là sự lựa chọn của lập trình viên về cách bạn muốn cấu trúc mã của mình. –

+1

@Steven: bạn sai về 'using' trong trường hợp này. Nếu nó là 'using (var x = new StreamReader())' thì nó sẽ là một lựa chọn - 'StreamReader' thuộc về bạn bởi vì bạn đã tạo nó. Trong trường hợp này, 'Stream' thuộc về đối tượng' Request' - bạn không tạo nó, vì vậy bạn không nên gọi 'Dispose' trên nó - bao giờ hết. –

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