2011-08-29 26 views
5

Tôi đọc một số bài viết về vấn đề này và tôi thấy rằng để đạt được WCF mà lấy dữ liệu từ bài yêu cầu chúng ta thêmTiêu thụ dữ liệu mẫu bởi dịch vụ WCF gửi qua đường bưu điện

[ServiceContract] 
public interface IService1 { 
    [OperationContract] 
    [WebInvoke(
     Method = "POST", 
     BodyStyle = WebMessageBodyStyle.Bare, 
     UriTemplate = "/GetData")] 
    void GetData(Stream data); 
} 

và trong việc thực hiện

public string GetData(Stream input) 
{ 
    long incomingLength = WebOperationContext.Current.IncomingRequest.ContentLength; 
    string[] result = new string[incomingLength]; 
    int cnter = 0; 
    int arrayVal = -1; 
    do 
    { 
     if (arrayVal != -1) result[cnter++] = Convert.ToChar(arrayVal).ToString(); 
     arrayVal = input.ReadByte(); 
    } while (arrayVal != -1); 

    return incomingLength.ToString(); 
} 

Câu hỏi của tôi là tôi nên làm gì trong hành động gửi trong yêu cầu biểu mẫu sẽ gửi đến dịch vụ của tôi và tiêu thụ?

Trong thông số luồng, tôi có thông tin bài đăng từ biểu mẫu mà tôi có thể nhận được bằng Yêu cầu ["FirstName"] không?

Trả lời

10

Mã của bạn không giải mã đúng nội dung yêu cầu - bạn đang tạo mảng giá trị string, mỗi giá trị có một ký tự. Sau khi nhận được yêu cầu, bạn cần phải phân tích chuỗi truy vấn (sử dụng HttpUtility là cách dễ dàng để thực hiện). Mã dưới đây cho thấy cách lấy nội dung và một trong các trường chính xác.

public class StackOverflow_7228102 
{ 
    [ServiceContract] 
    public interface ITest 
    { 
     [OperationContract] 
     [WebInvoke(
      Method = "POST", 
      BodyStyle = WebMessageBodyStyle.Bare, 
      UriTemplate = "/GetData")] 
     string GetData(Stream data); 
    } 
    public class Service : ITest 
    { 
     public string GetData(Stream input) 
     { 
      string body = new StreamReader(input).ReadToEnd(); 
      NameValueCollection nvc = HttpUtility.ParseQueryString(body); 
      return nvc["FirstName"]; 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     WebClient c = new WebClient(); 
     c.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; 
     Console.WriteLine(c.UploadString(baseAddress + "/GetData", "FirstName=John&LastName=Doe&Age=33")); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+0

Giải pháp tuyệt vời Tnx;) Nhưng trong phương pháp Kiểm tra Bạn gọi dịch vụ và gửi tới yêu cầu đăng. Có thể (và cách thông minh để thực hiện) để gọi phương thức dịch vụ sau khi gửi dưới dạng

? Nếu tôi làm như vậy nó sẽ hoạt động? :) – netmajor

+0

Có, nó sẽ hoạt động (các phương pháp thử nghiệm mô phỏng những gì một bài viết dạng HTML sẽ gửi). Vấn đề là khi bạn làm một biểu mẫu gửi theo mặc định, bạn nên tạo một trang HTML để gửi nó trở lại (thay vì một chuỗi đơn giản), nếu không trình duyệt sẽ chỉ hiển thị cho bạn chuỗi trở lại. Một tùy chọn khác là sử dụng một số cuộc gọi ajax trong biểu mẫu gửi, sau đó bạn có thể lấy lại kết quả dưới dạng XML (hoặc JSON) và cập nhật nội tuyến trang. – carlosfigueira

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