2012-04-24 25 views
9

Jak nazwałbym API ASP.NET Web bezpośrednio z opóźnionego kodu? A może powinienem wywoływać funkcję javascript, która wywołuje metodę getJSON z tyłu kodu?Zadzwoń do API ASP.NET Web z kodu źródłowego

zazwyczaj mam coś takiego:

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

Wszelkie wskazówki mile widziane. TIA.

* Używam WebForms.

+0

Co masz na myśli przez "code-behind"? – SLaks

+0

@SLaks Powiedz, że mam przycisk asp:. Na wydarzenie click (po stronie serwera/kodu), chciałbym zrobić kilka rzeczy, a następnie wywołać moją akcję Web API (createfile). Mam nadzieję, że jestem jasny. – Rivka

+0

Pls sprawdź przykład mojego kodu. Być może nieco naiwny i prosty, ale to tylko dla ciebie 2 pomysł. –

Odpowiedz

13

Jeśli musisz zadzwonić do samej usługi internetowej, możesz spróbować użyć usługi HttpClientas described by Henrik Neilsen.

Updated HTTPClient Samples

Podstawowym przykładem:

// 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

Dziękujemy! Dokładnie to, co próbowałem zrobić. Przepraszam, e/o else za ewentualne nie wyjaśnienie dobrze. Doceń wszelką pomoc. – Rivka

+0

Kiedy próbuję przekonwertować to na vb.net requestTask.Result nie skompiluję, mówiąc "wynik nie jest członkiem system.threading.tasks.task", ale w C# znajduje się w httpresponsemessage. czy ta własność nie jest w vb.net?Użyłem strony konwersji telerek do konwersji – Matma

3

Zalecane w wielu podręcznikach dotyczących architektury oprogramowania jest to, że nie należy umieszczać logiki biznesowej w kodzie kontrolera (API). Zakładając, że wdrożysz go we właściwy sposób, na przykład, że twój kod kontrolera aktualnie uzyskuje dostęp do logiki biznesowej poprzez klasę usługi lub fasadę, moja sugestia jest taka, że ​​używasz ponownie tej samej klasy/fasady usług w tym celu, zamiast przechodzić przez "drzwi wejściowe" "(tak, wykonując połączenia JSON od kod związany)

do podstawowego i naieve przykład:

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; 
    } 
} 

klasa AppService obudowuje logiki biznesowej (a nie żyć na innej warstwie) i sprawia, że ​​łatwiej dostęp do logiki:

public class AppService: IAppService { 

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

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

    } 

    ... 
} 
+2

Twierdzę, że użycie słowa "Poprawnie" jest nieprawidłowe. Istnieją na pewno paradygmaty projektowe, które to zalecają, podobnie jak inne, które mówią, że cała ścieżka kontrolera/fasady/etc to ogromna ilość zmarnowanego kodu/godzin pracy. Nie zamierzam przegłosować; jednak mówię tylko, że istnieje wiele definicji "prawidłowego" projektowania oprogramowania, z których większość zależy od sytuacji. – NotMe

+1

To prawda, mój angielski nie jest doskonały, "poprawne" nie było poprawnym słowem. –

+1

Dziękujemy za podanie przykładu. Myślę, że widzę, co mówisz o klasach, ale moje pytanie dotyczy rzeczywistego wywołania metody CreateFile() w WebAPI. Jak powinienem wywoływać to ze zdarzenia po stronie serwera w aplikacji Web Forms? Jakie jest najlepsze podejście? – Rivka

6

Powinieneś odłożyć logikę na osobną klasę backendu i wywołać ją bezpośrednio z kodu użytkownika z tyłu i z działania interfejsu API sieci Web.

+0

jakiś przykładowy kod pomógłby ... Utknąłem na "zadzwoń do niego bezpośrednio z twojego kodu" - Zazwyczaj Robię to z moją funkcją JS. – Rivka

+0

@Becky: Zadzwoń do oddzielnej klasy bezpośrednio zza kodu źródłowego. – SLaks