2017-12-29 5 views
3

Asp.NET WebApi를 비즈니스 계층으로 사용합니다. 간단히 비즈니스 컨트롤러를 호출하여 메서드라고 부릅니다. 이 같은 뭔가 : (하지만 난 서비스 참조와 같은이 webapi을 추가 할 수 없습니다 해요) 내가 추가하여 웹 서비스의 인스턴스를 바로 생성 할 수 있었다 WCF 웹 서비스와 함께 일하고 이전ASAP 웹 서비스처럼 웹 API를 사용하여 WebAPI를 사용하는 방법

Business.API.UserController Users = new Business.API.UserController(); 
Users.GetAllUser(); 

그것은 "서비스 참조 추가"와 일부 종점 설정을 통해 가능합니다. 나는 WebAPI에서 그렇게 할 수 없다 (나는 생각한다). 나는 그것에 대해 많은 기사를 읽었지 만 대부분은 HttpRequest에 의한 메소드 호출에 관한 것이었다. 이 방법으로 :

using (var client = new HttpClient())  
{  
    client.BaseAddress = new Uri("http://localhost:38104/"); 
    client.DefaultRequestHeaders.Accept.Clear();  
    HttpResponseMessage response;  
    response = await client.GetAsync("api/Weather");  
    if (response.IsSuccessStatusCode)  
    {  
     WeatherClient[] reports = await response.Content.ReadAsAsync<WeatherClient[]>();     
    }  
}  

나는 그것이 웹 서비스의 이용 말도 안되는 생각합니다. 내가 잘못되었거나 나에게 문제가 있습니까?

+0

swagger (웹 서비스에 대한 API 설명을 생성하는 것)를 사용하고 그 API 설명에서 클라이언트를 생성 할 수있는 몇 가지 도구를 사용할 수 있습니다. – Evk

+0

코드에서 볼 수있는 주된 문제점은 각 요청에 대해 새로운'HttpClient'를 생성한다는 것입니다. 이것은 공유 객체이기 때문에 서버 연결을 고갈시키지 않습니다. – Crowcoder

답변

6

아무 문제가 없지만 웹 서비스를 사용하는 어리석은 방법은 아닙니다. 사실로; 그 에만 웹 서비스를 사용하는 방법; WCF가 그 코드를 숨겼습니다.

면책 조항 : WCF와 같은 클래스로 숨길 다른 .NET 클래스와 HTTP 요청을 수행하고 간단한 API를 가질 수있다 라이브러리,하지만 아무것도

WCF 서비스 자체에 대한 메타 데이터를 게시 할 수 있습니다 이것이 "서비스 참조"가 작동하는 이유입니다. 웹 API에는 유사한 개념이 없으므로 수동으로 HTTP 요청을 수행해야합니다. 물론이 코드를 재사용을위한 일부 일반 함수로 묶을 수 있습니다.

오른쪽 도우미 메서드를 사용하면 이름 대신 각 메서드의 끝점을 전달하기 만하면 "RPC"인터페이스에 접근 할 수 있습니다.

+0

감사. 이 접근 방식의 주요 문제는 스트리밍 출력 및 입력에 직면했습니다. HttpRequests를 사용하여 스트림을 전달하거나 스트림을 얻을 수있는 방법을 알고 싶습니다.그래서 나는 생각하는 근본을 읽어야한다. – RezaNoei

+0

@RezaNoei .NET Http 클래스 중 하나 이상에 스트림 API가 있습니다. 보통 그들은 그와 같은 것을 다루는 고통이 있습니다. – BradleyDotNET

+0

그렇게 잘 정의 된 방법이없는 것 같습니다. 다시 한번 감사드립니다. – RezaNoei

2

클래스가 HttpClient을 직접 인스턴스화하는 대신 인터페이스에 의존하는 것이 가장 좋습니다. WCF 서비스 (서비스 인터페이스에 따라 다름)를 사용하여 올바르게 수행 한 응용 프로그램을 보았지만 웹 API의 경우 추상화를 버리고 직접 HTTP 요청을 통합했습니다.

응용 프로그램 내에서 구현 - 웹 API, 모의, 다른 어떤 것 -이 추상화되도록 일부 서비스를 나타내는 인터페이스를 정의 할 수 있습니다.

예를 들어,이 인터페이스

public interface IFooService 
{ 
    FooDto GetFoo(Guid id); 
    List<FooDto> GetAllFoos(); 
    Guid InsertFoo(FooInsertDto foo); 
    void UpdateFoo(FooDto updating); 
    void DeleteFoo(Guid id); 
} 

에 따라이 구현 사용할 수 있습니다 :

public class FooServiceClient : IFooService 
{ 
    private readonly RestClient _restClient; 

    public FooServiceClient(string baseUrl) 
    { 
     _restClient = new RestClient(baseUrl.TrimEnd('/')); 
    } 

    public FooDto GetFoo(Guid id) 
    { 
     var request = new RestRequest($"api/foo/get{id}", Method.GET); 
     var foo = _restClient.Execute<FooDto>(request).Data; 
     return foo; 
    } 

    public List<FooDto> GetAllFoos() 
    { 
     var request = new RestRequest("api/foo/getall", Method.GET); 
     var foos = _restClient.Execute<List<FooDto>>(request).Data; 
     return foos; 
    } 

    public Guid InsertFoo(FooInsertDto foo) 
    { 
     var request = new RestRequest("api/foo/insert", Method.POST) 
      { RequestFormat = DataFormat.Json}; 
     request.AddBody(foo); 
     return _restClient.Execute<Guid>(request).Data; 
    } 

    public void UpdateFoo(FooDto updating) 
    { 
     var request = new RestRequest("api/foo/update", Method.POST) 
     { RequestFormat = DataFormat.Json }; 
     request.AddBody(updating); 
     _restClient.Execute(request); 
    } 

    public void DeleteFoo(Guid id) 
    { 
     var request = new RestRequest("api/foo/delete", Method.POST) 
     { RequestFormat = DataFormat.Json }; 
     request.AddBody(id); 
     _restClient.Execute(request); 
    } 
} 

이것은 또한 RestSharp을 사용하는 방법을 보여줍니다한다. 각 용도별로 HttpClient을 만들고 처분하지 않는 것이 좋습니다. RestSharp는이를 관리하고 요청 전송 및 응답 읽기를 단순화하는 방법을 제공합니다.

+0

고마워요. 나는이 지식을 소유하기 위해 오랜 여행을하고 있습니다. – RezaNoei

관련 문제