2010-12-30 42 views
6

Tôi biết loại đếm này là phát minh lại bánh xe ở đây, nhưng tôi cần phải biết để giao tiếp với một dịch vụ web thông qua http/soap/xml và tin nhắn web. Lý do là tôi cần phải giao tiếp với một dịch vụ web của bên thứ ba cho công việc, nhưng có cái gì đó sai với WSDL hoặc một cái gì đó và nó không hoạt động khi kết nối với nó bằng thuật sĩ .NET.Làm cách nào để gửi thông tin tới một dịch vụ web bằng C# bằng .NET?

Vì vậy, bất kỳ ai cũng có thể cho tôi một quy trình/ví dụ đơn giản/v.v. làm thế nào để làm điều này hoặc bất cứ ai có thể cho tôi một liên kết đến một nơi nào đó giải thích nó? Tôi không hiểu rõ về các yêu cầu và phản hồi trên web.

Làm cách nào để tạo và gửi yêu cầu? Làm cách nào để phân tích cú pháp phản hồi?

Đây là mã cho một dịch vụ web đơn giản. Giả sử địa chỉ của .asmx là "http://www.mwebb.com/TestSimpleService.asmx":

using System; 
using System.Data; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

namespace TestSimpleService 
{ 
    [WebService] 
    public class Soap : System.Web.Services.WebService 
    { 
     [WebMethod] 
     public string SayHello(string name) 
     { 
      return "Hello " + name + "!"; 
     } 
    } 
} 

Tôi gọi phương thức này như thế nào?

Mọi trợ giúp đều được đánh giá cao.

EDIT

Tôi thực sự chỉ muốn biết làm thế nào để gửi dữ liệu đến các dịch vụ web. Tôi có thể lấy tất cả dữ liệu phương thức/SOAP hành động/URL và tôi có thể phân tích cú pháp dữ liệu phản hồi. Tôi chỉ không biết những gì các đối tượng để sử dụng hoặc làm thế nào để sử dụng chúng.

Nếu có ai biết về một số ứng dụng khách xà phòng .NET đơn giản như SUDS bằng Python, điều đó cũng sẽ hữu ích.

+0

@ Mike Bạn không cần phải tiêu thụ WSDL trong VS; bạn có thể sử dụng wsdl.exe http://msdn.microsoft.com/en-us/library/7h3ystb6(v=VS.100).aspx nếu bạn ít nhất có thể truy cập WSDL thông qua trình duyệt và sau đó tải WSDL xuống đĩa cục bộ –

+0

nếu bạn cần một cách tiếp cận VS-less trên webservice tiêu thụ: http://notepad-webservices.blogspot.com/2006/04/web-services-no-source-code-on-server.html nhưng vẫn sử dụng wsdl –

+0

Có gì đó sai với WSDL, vì vậy tôi thực sự không thể sử dụng nó. Phải có cách gửi/nhận dữ liệu bằng cách sử dụng các đối tượng yêu cầu/phản hồi xà phòng trong .NET. Điều đó hoặc phải có một thư viện đơn giản để làm điều này như Suds trong Python. –

Trả lời

6

Nếu bạn muốn liên lạc trực tiếp, tôi sẽ xem xét bằng cách sử dụng HTTPWebRequest như một cuộc gọi webservice chỉ là XML được gửi bằng HTTP POST.

Các liên kết sau đây có một số ví dụ: http://geekswithblogs.net/marcel/archive/2007/03/26/109886.aspx

Như một cách để thử nghiệm các webservice bên ngoài trước khi liên hệ với nó lập trình với net một cách là sử dụng một công cụ kiểm tra như SOAPUI để tạo ra XML chính xác mà bạn nghĩ cần phải được đăng lên webservice và gửi nó bằng tay với công cụ

Sau đó, bạn có thể phát triển các .net tương đương

EDIT - đây là một ví dụ nhanh tôi gõ lên để gọi bạn (SOAP1.2 sử dụng) dịch vụ ví dụ dựa trên liên kết ở trên:

 { 
      string soap = @"<?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://www.w3.org/2003/05/soap-envelope""> 
    <soap:Body> 
    <SayHello xmlns=""http://tempuri.org/""> 
     <name>My Name Here</name> 
    </SayHello> 
    </soap:Body> 
</soap:Envelope>"; 

      HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:2439/Soap.asmx"); 
      req.ContentType = "application/soap+xml;"; 
      req.Method = "POST"; 

      using (Stream stm = req.GetRequestStream()) 
      { 
       using (StreamWriter stmw = new StreamWriter(stm)) 
       { 
        stmw.Write(soap); 
       } 
      } 

      WebResponse response = req.GetResponse(); 
      Stream responseStream = response.GetResponseStream(); 

      // Do whatever you need with the response 
      Byte[] myData = ReadFully(responseStream); 
      string s = System.Text.ASCIIEncoding.ASCII.GetString(myData); 
     } 

Phương thức ReadFully xuất phát từ http://www.yoda.arachsys.com/csharp/readbinary.html và có vẻ như phương thức này bắt nguồn từ Jon Skeet.

+0

'Sử dụng câu lệnh 'xung quanh phản hồi? –

0

XML-RPC.NET cho phép tạo liên kết khi đang di chuyển.

Ví dụ: (ví dụ từ trang web của họ):

[XmlRpcUrl("http://betty.userland.com/RPC2")] 
public interface IStateName : IXmlRpcProxy 
{ 
    [XmlRpcMethod("examples.getStateName")] 
    string GetStateName(int stateNumber); 
} 
+1

Tôi sẽ dùng thử. –

+0

-1: đó là một dịch vụ SOAP, không phải là RPC XML. –

+0

Ồ, không nhận ra có sự khác biệt. Cho thấy tôi am hiểu về chủ đề này như thế nào :) Yah, tôi đã thử nó và nó không hoạt động. Đoán đó là lý do. –

0

Nếu dịch vụ của bạn thực sự đơn giản như ví dụ của bạn, thì chỉ cần sử dụng "Thêm tham chiếu dịch vụ" và sử dụng proxy.

Nếu điều đó không hoạt động, sau đó sử dụng chương trình svcutil.exe dòng lệnh và đăng các thông báo lỗi được in.

Không sử dụng WSDL.EXE trừ khi bạn không có lựa chọn.

1

Mã của câu trả lời đã chọn không hoạt động đối với tôi. Tôi phải thêm SOAPAction vào tiêu đề và cũng có thể thay đổi ContentType.

Dưới đây là toàn bộ mã:

var strRequest = @"<soap12:Envelope> 
        ... 
        </soap12:Envelope>"; 

string webServiceUrl = "http://localhost:8080/AccontService.svc"; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webServiceUrl); 

request.Method = "POST"; 
request.ContentType = "text/xml;charset=UTF-8";   
request.Accept = "text/xml"; 
request.Headers.Add("SOAPAction", "http://tempuri.org/IAccountService/UpdateAccount"); 

byte[] data = Encoding.UTF8.GetBytes(strRequest); 

request.ContentLength = data.Length; 
Stream requestStream = request.GetRequestStream(); 
requestStream.Write(data, 0, data.Length); 
requestStream.Close(); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
string responseXmlString = reader.ReadToEnd(); 

return new HttpResponseMessage() 
{ 
    Content = new StringContent(responseXmlString, Encoding.UTF8, "application/xml") 
}; 
Các vấn đề liên quan