2009-08-03 49 views
22

Tôi có một dịch vụ web có chứa phương pháp này:Cách gọi một Phương thức Dịch vụ Web?

[WebMethod] 
public static List<string> GetFileListOnWebServer() 
{ 
    DirectoryInfo dInfo = new DirectoryInfo(HostingEnvironment.MapPath("~/UploadedFiles/")); 
    FileInfo[] fInfo = dInfo.GetFiles("*.*", SearchOption.TopDirectoryOnly); 

    List<string> listFilenames = new List<string>(fInfo.Length); 

    for(int i = 0; i < fInfo.Length; i++) 
    { 
     listFilenames.Add(fInfo[i].Name); 
    } 

    return listFilenames; 
} 

này trả về một danh sách các tên tập tin trong một thư mục. Khi tôi gỡ lỗi ứng dụng, nó hoạt động tốt.

Điều tôi muốn làm là gọi phương thức webservice này từ ứng dụng biểu mẫu. Tôi đã thêm một tham chiếu đến .dll của webservice, và đây là cách tôi gọi phương thức trên:

private void Form1_Load(object sender, EventArgs e) 
{ 
    List<string> files = TestUploaderWebService.Service1.GetFileListOnWebServer(); 
} 

Đoạn mã trên không hoạt động - khi nó đi vào phương pháp, đường dẫn của ứng dụng web là null và nhiều thuộc tính từ lớp HostingEnvironment cũng không có giá trị. Sai lầm của tôi ở đâu, khi cố gắng gọi một phương thức dịch vụ web từ một ứng dụng winform khác?

Xin lưu ý rằng dịch vụ web được thực hiện trong Visual Web Developer Express và biểu mẫu winform trong Visual C# express; đây là lý do tại sao tôi phải thêm dll dịch vụ web làm tham chiếu trong ứng dụng biểu mẫu. Tôi không có Visual Studio đầy đủ, mà sẽ cho phép tôi một giải pháp duy nhất với cả hai dự án.

Tôi mới sử dụng dịch vụ web.

PS - tôi yêu các định dạng của văn bản on-the-fly đây :)

Trả lời

18

Trong visual studio, sử dụng "Add Web Reference" tính năng và sau đó nhập vào địa chỉ URL của dịch vụ web của bạn.

Bằng cách thêm tham chiếu đến tệp DLL, bạn không tham chiếu nó dưới dạng dịch vụ web, mà chỉ đơn giản là một hội đồng.

Khi bạn thêm tham chiếu web, nó tạo lớp proxy trong dự án của bạn có cùng các phương thức/đối số tương tự như dịch vụ web của bạn. Lớp proxy đó giao tiếp với dịch vụ web của bạn thông qua SOAP nhưng ẩn tất cả các giao thức truyền thông để bạn không phải lo lắng về nó.

+0

tuyệt vời - cảm ơn bạn rất nhiều! Bây giờ tôi đã loại bỏ các ref dll, và thêm một tài liệu tham khảo dịch vụ cho URL. Tuy nhiên tôi đã nhận thấy nó không cho tôi truy cập trực tiếp đến phương pháp của tôi, thay vào đó tôi nhận được quyền truy cập vào các lớp học được gọi là: GetFileListOnWebServerRequest, GetFileListOnWebServerRequestBody, GetFileListOnWebServerResponse, GetFileListOnWebServerResponseBody.có bất kỳ tài nguyên web nào tôi có thể đọc về các lớp được tạo tự động này không? Tôi không biết cách sử dụng chúng. –

+0

Nó tạo ra rất nhiều phần, nhưng chỉ cần tìm phương thức GetFileListOnWebServer. –

+1

Thực ra, hãy nhìn vào ví dụ của John. –

1

Câu trả lời của James là chính xác, tất nhiên, nhưng tôi nên nhắc bạn rằng toàn bộ điều ASMX là, nếu không lỗi thời, ít nhất không phải là phương pháp hiện tại. Tôi đề nghị bạn nên nhìn vào WCF, nếu chỉ để tránh học những điều bạn sẽ cần phải quên.

+0

Cảm ơn câu trả lời của bạn, Steven! Tôi chắc chắn sẽ nhìn vào WCF. Tuy nhiên đối với nhiệm vụ này, nó là một "bài tập về nhà" asignment vì vậy tôi đã nói với sử dụng asmx :) Chúc mừng! –

+0

Ok, nhưng nếu đó là bài tập về nhà, vui lòng gắn thẻ như vậy. Tôi đã tự do làm điều này cho bạn. –

10

Cách hiện tại để thực hiện việc này là sử dụng lệnh "Thêm tham chiếu dịch vụ". Nếu bạn chỉ định "TestUploaderWebService" làm tên tham chiếu dịch vụ, sẽ tạo loại TestUploaderWebService.Service1. Lớp đó sẽ có một phương thức có tên là GetFileListOnWebServer, sẽ trả về một chuỗi các chuỗi (bạn có thể thay đổi đó thành một danh sách các chuỗi nếu bạn muốn). Bạn sẽ sử dụng nó như thế này:

string[] files = null; 
TestUploaderWebService.Service1 proxy = null; 
bool success = false; 
try 
{ 
    proxy = new TestUploaderWebService.Service1(); 
    files = proxy.GetFileListOnWebServer(); 
    proxy.Close(); 
    success = true; 
} 
finally 
{ 
    if (!success) 
    { 
     proxy.Abort(); 
    } 
} 

T.B. Yêu cầu người hướng dẫn của bạn xem "Microsoft: ASMX Web Services are a “Legacy Technology”" và hỏi lý do tại sao anh ấy dạy công nghệ cũ.

+0

Cảm ơn rất nhiều John, tôi đã tìm ra phương pháp dựa trên ví dụ của bạn. –

-1

viết return(secondmethod) bên trong của phương pháp đầu tiên

enter image description here

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