2009-04-01 8 views
5

Tôi đang cố gắng gọi [webmethod] từ C#. Tôi có thể gọi webmethod đơn giản có tham số 'chuỗi'. Nhưng tôi có một webmethod mà mất trong một tham số 'byte []'. Tôi đang chạy vào '500 lỗi máy chủ nội bộ' khi tôi cố gọi nó. Đây là một số ví dụ về những gì tôi đang làm.Làm thế nào để sử dụng HttpWebRequest để gọi một hoạt động dịch vụ Web có tham số byte []?

phép nói rằng phương pháp của tôi là như thế này

[WebMethod] 
public string TestMethod(string a) 
{ 
    return a; 
} 

tôi gọi nó như thế này sử dụng HttpRequest trong C#

  HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
      req.Credentials = CredentialCache.DefaultCredentials; 
      req.Method = "POST"; 
      // Set the content type of the data being posted. 
      req.ContentType = "application/x-www-form-urlencoded"; 

      string inputData = "sample webservice"; 
      string postData = "a=" + inputData; 
      ASCIIEncoding encoding = new ASCIIEncoding(); 
      byte[] byte1 = encoding.GetBytes(postData); 

      using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) 
      { 
       StreamReader sr = new StreamReader(res.GetResponseStream()); 
       string txtOutput = sr.ReadToEnd(); 
       Console.WriteLine(sr.ReadToEnd()); 
      } 

này hoạt động hoàn toàn tốt đẹp. Bây giờ tôi có một WebMethod được định nghĩa như thế này

[WebMethod] 
public string UploadFile(byte[] data) 

Tôi đã thử gọi nó như thế này

  ASCIIEncoding encoding = new ASCIIEncoding(); 
      string postData = "data=abc"; 
      byte[] sendBytes = encoding.GetBytes(postData); 
      req.ContentLength = sendBytes.Length; 
      Stream newStream = req.GetRequestStream(); 
      newStream.Write(sendBytes, 0, sendBytes.Length); 

Nhưng điều đó mang lại cho tôi một lỗi 500 nội :(

Trả lời

0

Bạn có thể sẽ cần phải base64 Mã hóa dữ liệu nhị phân

Nhưng lỗi 500 là một đầu mối để xem nhật ký sự kiện Windows và xem điều gì đã xảy ra ở phía máy chủ.

3

Bạn đang sử dụng khả năng HTTP POST/HTTP GET của hệ thống ống nước ASP.NET Web Service thay vì gửi một cuộc gọi dịch vụ web thực tế. Đây là một cơ chế cho phép bạn kiểm tra các dịch vụ web đơn giản nhưng nó không thực sự được thiết kế để sử dụng trong một ứng dụng sản xuất. Thực tế, nếu bạn điều hướng đến URL dịch vụ web, bạn sẽ thấy rằng nó thậm chí không thể hiển thị biểu mẫu đầu vào thử nghiệm cho loại tham số đó. Nó có thể có thể tìm ra một cách để lừa nó vào làm việc, nhưng phải trung thực, bạn chỉ nên sử dụng nó theo cách nó được dự định và tạo ra một proxy dịch vụ web.

Trong vòng Visual Studio nhấp chuột phải vào dự án có chứa mã máy khách và chọn Thêm dịch vụ hoặc Tham chiếu web. Sau đó nhập URL vào dịch vụ web và nó sẽ tạo một proxy. Nếu bạn đang sử dụng WCF, nó sẽ trông giống như sau:

// ServiceNameClient is just a sample name, the actual name of your client will vary. 
string data = "abc"; 
byte[] dataAsBytes = Encoding.UTF8.GetBytes(data); 
ServiceNameClient client = new ServiceNameClient(); 
client.UploadFile(dataAsBytes); 

Hy vọng điều này sẽ hữu ích.

+0

cho phép nói rằng tôi đã sử dụng C++ và HttpOpenRequest .. làm thế nào tôi sẽ làm điều đó sau đó? – shergill

+0

Không chắc chắn trên đỉnh đầu của tôi :) –

+2

Nếu mã trên hoạt động bạn có thể sử dụng Fiddler để xem cách yêu cầu http được xây dựng và sau đó sử dụng thông tin đó để mã tùy chỉnh của bạn hoạt động. –

5

nó là có thể, tôi đã làm nó bản thân mình

Đầu tiên các thiết lập Header, điều này có thể thu được nếu webservice của bạn có thể được thực hiện thông qua web và gửi các thông số. Tôi sử dụng công cụ dành cho nhà phát triển từ Chrome. Cách đơn giản là xem lại những mô tả về webservice (ví dụ http: //myweb.com/WS/MyWS.asmx op = Validation)

WebRequest request = WebRequest.Create(http://myweb.com/WS/MyWS.asmx?op=Validation); 
request.Method = "POST"; 
((HttpWebRequest)request).UserAgent = ".NET Framework Example Client"; 
request.ContentType = "text/xml; charset=utf-8"; 
((HttpWebRequest)request).Referer = "http://myweb.com/WS/MyWS.asmx?op=Validation"; 
((HttpWebRequest)request).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
((HttpWebRequest)request).Host= "myweb.com"; 
request.Headers.Add("SOAPAction","http://myweb.com/WS/Validation"); 

Sau đó, yêu cầu phần

string message = "a=2"; 
string envelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+ 
     "<soap:Body><Validation xmlns=\"http://myweb.com/WS\"><data>@Data</data></Validation></soap:Body></soap:Envelope>"; 
string SOAPmessage = envelope.Replace("@Data", System.Web.HttpUtility.HtmlEncode(message)); 
// The message must be converted to bytes, so it can be sent by the request 
byte[] data = Encoding.UTF8.GetBytes(SOAPmessage); 
request.ContentLength = data.Length; 
request.Timeout = 20000; 
Stream dataStream = request.GetRequestStream(); 
dataStream.Write(data, 0, data.Length); 
dataStream.Close(); 
WebResponse response = request.GetResponse(); 
Stream inputStream = response.GetResponseStream(); 

Bây giờ bạn có thể nhận luồng đến từ phản hồi

Hãy nhớ điều chỉnh phong bì SOAP và các thông số được gửi theo mô tả được đưa ra bởi các chi tiết trang từ webservice (ví dụ: http: //myweb.com/WS/MyWS .asmx? op = Xác nhận).