2012-04-24 45 views
9

Làm cách nào để gọi ASP.NET Web API trực tiếp từ mã sau? Hoặc tôi nên gọi hàm javascript của tôi gọi phương thức getJSON từ mã-đằng sau?Gọi ASP.NET Web API từ mã sau

tôi thường có cái gì đó như:

function createFile() { 
     $.getJSON("api/file/createfile", 
     function (data) { 
      $("#Result").append('Success!'); 
     }); 
    } 

Bất kỳ con trỏ đánh giá cao. TIA.

* Tôi đang sử dụng WebForms.

+0

Ý anh là gì bởi "code-behind"? – SLaks

+0

@SLaks Giả sử tôi có nút asp:. Trên sự kiện bấm của nó (phía máy chủ/mã-đằng sau), tôi muốn làm một vài thứ và sau đó gọi hành động Web API của tôi (createfile). Hy vọng tôi rõ ràng. – Rivka

+0

Xin vui lòng kiểm tra ví dụ mã của tôi. Có lẽ một chút ngây thơ và cơ bản, nhưng nó chỉ dành cho bạn 2 có được ý tưởng. –

Trả lời

13

Nếu bạn phải tự gọi dịch vụ web, bạn có thể thử sử dụng HttpClientas described by Henrik Neilsen.

Updated HTTPClient Samples

Một ví dụ cơ bản:

// Create an HttpClient instance 
HttpClient client = new HttpClient(); 

// Send a request asynchronously continue when complete 
client.GetAsync(_address).ContinueWith( 
    (requestTask) => 
    { 
     // Get HTTP response from completed task. 
     HttpResponseMessage response = requestTask.Result; 

     // Check that response was successful or throw exception 
     response.EnsureSuccessStatusCode(); 

     // Read response asynchronously as JsonValue 
     response.Content.ReadAsAsync<JsonArray>().ContinueWith( 
        (readTask) => 
        { 
         var result = readTask.Result 
         //Do something with the result     
        }); 
    }); 
+0

Cảm ơn bạn! Chính xác những gì tôi đã cố gắng làm. Xin lỗi vì e/o có thể không giải thích rõ. Đánh giá cao sự giúp đỡ của bạn. – Rivka

+0

Khi tôi cố gắng chuyển đổi điều này sang vb.net requestTask.Result wont biên dịch nói "kết quả không phải là thành viên của system.threading.tasks.task" nhưng trong C# được tìm thấy trong httpresponsemessage. tài sản này không có trong vb.net không?tôi đã sử dụng trang chuyển đổi telerek để thực hiện chuyển đổi – Matma

3

Được đề xuất trong nhiều sách kiến ​​trúc phần mềm là bạn không nên đặt bất kỳ logic nghiệp vụ nào trong mã bộ điều khiển (API) của mình. Giả sử bạn thực hiện nó đúng cách, ví dụ mã Controller của bạn hiện đang truy cập logic nghiệp vụ thông qua một lớp Service hoặc facade, gợi ý của tôi là bạn sử dụng lại cùng một lớp Service/facade cho mục đích đó, thay vì đi qua cửa trước '(vì vậy bằng cách thực hiện các cuộc gọi JSON từ mã đằng sau)

đối với cơ bản và naieve dụ:

public class MyController1: ApiController { 

    public string CreateFile() { 
     var appService = new AppService(); 
     var result = appService.CreateFile(); 
     return result; 
    } 

} 

public class MyController2: ApiController { 

    public string CreateFile() { 
     var appService = new AppService(); 
     var result = appService.CreateFile(); 
     return result; 
    } 
} 

lớp AppService đóng gói logic kinh doanh của bạn (và không sống trên lớp khác) và làm cho nó dễ dàng hơn cho bạn truy cập vào logic của bạn:

public class AppService: IAppService { 

    public string MyBusinessLogic1Method() { 
     .... 
     return result; 
    } 
    public string CreateFile() { 

      using (var writer = new StreamWriter..blah die blah { 
      ..... 
      return 'whatever result'; 
      } 

    } 

    ... 
} 
+2

Tôi cho rằng việc sử dụng 'Chính xác' của bạn không chính xác. Chắc chắn có những mô hình thiết kế ủng hộ điều này, cũng giống như có những người khác nói rằng toàn bộ con đường điều khiển/mặt tiền/etc là một số lượng lớn giờ lãng phí mã/giờ. Tôi sẽ không downvote; tuy nhiên, tôi chỉ nói rằng có rất nhiều định nghĩa về 'Chính xác' cho thiết kế phần mềm phần lớn trong số đó là phụ thuộc tình huống. – NotMe

+1

Đúng, tiếng Anh của tôi không hoàn hảo, 'Đúng' không phải là từ đúng. –

+1

Cảm ơn bạn đã cung cấp một ví dụ. Tôi nghĩ rằng tôi thấy những gì bạn đang nói về các lớp học, mặc dù câu hỏi của tôi là trên phương thức gọi thực tế của CreateFile() trong WebAPI. Tôi nên gọi điều đó như thế nào từ sự kiện phía máy chủ trong ứng dụng Biểu mẫu web? Đâu là cách tiếp cận lí tưởng nhất? – Rivka

6

Bạn nên cấu trúc lại logic thành một lớp phụ trợ riêng biệt và gọi nó trực tiếp từ mã phía sau và từ hành động Web API.

+0

một số mã mẫu sẽ giúp ... Tôi bị kẹt vào "gọi nó trực tiếp từ mã của bạn" phần- Thông thường Tôi làm điều đó với chức năng JS của tôi. – Rivka

+0

@ Becky: Gọi riêng lớp học trực tiếp từ mã của bạn. – SLaks

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