>source

ASP.NET Web Api REST 서비스를 호출하는 ASP.NET MVC 응용 프로그램이 있습니다.

public class MyClass
{
    private static HttpClient client = new HttpClient();
    public async Task DumpWarehouseDataIntoFile(Warehouse myData, string path, string filename)  // See Warehouse class later in this post
    { 
        try
        {
           //Hosted web API REST Service base url  
           string Baseurl = "http://XXX.XXX.XX.X:YYYY/";  
           //using (var client = new HttpClient())  --> I have declared client as an static variable
           //{  
            //Passing service base url  
            client.BaseAddress = new Uri(Baseurl);  
            client.DefaultRequestHeaders.Clear();  
            //Define request data format  
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));  
              
            // Serialize parameter to pass to the asp web api rest service
            string jsonParam = Newtonsoft.JsonConvert.SerializeObject(myData);
            //Sending request to find web api REST service resource  using HttpClient
            var httpContent = new StringContent(jsonParam, Encoding.UTF8, "application/json");
            HttpResponseMessage Res = await client.PostAsync("api/Warehouse/DumpIntoFile", httpContent);  
            //Checking the response is successful or not which is sent using HttpClient  
            if (Res.IsSuccessStatusCode)  
            {  
               // Some other sftuff here
            }
           //}
         }
         catch (Exception ex)
         {
              // Do some stuff here
         } // End Try
    } // End DumpWarehouseDataIntoFile method
} // End class

ASP.NET Web API REST 컨트롤러 :

public class WarehouseController : ApiController
{ 
    public bool DumpIntoFile(string data)
    {
           // Stuff here
    }
}

HttpClient 정적 변수를 사용했습니다.이 링크에 설명 된대로 권장되지 않기 때문에 'using'블록으로 묶지 않습니다.HTTPCLIENT를 잘못 사용하고 있으며 소프트웨어가 위험합니다.

이 코드가 실행되면 오류와 함께 실패합니다.

System.Net.Http.HttpRequestException: An error occurred while sending the request. System.Net.WebException: The remote name could not be resolved: 'xxx'

HttpClient 클라이언트 개체를 삭제할 필요가 없다고 생각합니다.

어떻게 해결할 수 있습니까?

Visual Studio 2013 및 NET 4.5 (Core 아님)를 사용하고 있습니다.

업데이트 2020/12/10: ASP.NET Web API REST Url이 내부 DNS에서 올바르게 구성되지 않았기 때문에 이전 오류가 발생했습니다.

이제 이전 오류를 해결 한 후 다음 중 하나를 얻습니다.

404 Not Found

client.PostAsync가 반환 한 오류 메시지는 다음과 같습니다.

ASP.NET Web API Rest에 대한 Ping이 작동합니다.

아래 App_Start \ WebApiConfig.cs 아래의 웹 API 경로 구성에 누락 된 것이 있습니까?

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Configuración y servicios de API web
        // Rutas de API web
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

  • 답변 # 1

    나는 당신이 웹 API 2를 사용하고 있다고 가정합니다. WebApiConfig 제공했습니다. 수신하는 404 응답과 관련하여 이는 전적으로 컨트롤러 작업에서 라우팅을 잘못 사용하거나 라우팅이 부족하기 때문입니다.

    예제 WebApiConfig를 사용하면 Web API에 대한 기본 경로 템플릿을 사용하여 규칙 기반 라우팅뿐 아니라 특성 라우팅을 사용할 수 있습니다. 기본 템플릿은 작업 이름에 따라 일치하지 않으며 컨트롤러 이름과 요청의 HTTP 메서드 (GET, POST 등)에 따라서 만 일치합니다. 예 GET http://localhost:5000/api/books/2 로 라우팅됩니다 BooksController 명명 규칙과 일치하는 작업 메서드를 호출합니다. GetBookById(int id) .

    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    
    

    귀하의 경우에는 DumpIntoFile(string data) 위의 표준 명명 규칙을 따르지 않으므로 라우팅 시스템은 호출 할 작업을 알지 못합니다. 구성에서 활성화 한 속성 라우팅을 사용하여이 문제를 해결할 수 있습니다. HTTP 동사와 메서드를 호출해야하는 경로를 지정하는 작업 메서드에 속성을 추가해야합니다. 경로 접두사를 지정하는 컨트롤러 클래스에 추가해야하는 추가 특성에 유의하십시오.

    [RoutePrefix("api/warehouse")]
    public class WarehouseController : ApiController
    {
        // Routes POST http://localhost:5000/api/warehouse/dump
        [Route("dump")]
        [HttpPost]
        public bool DumpIntoFile(string data)
        {
            //...
        }
    }
    
    

    이것은 POST 요청을 다음으로 라우팅합니다. http://localhost:5000/api/warehouse/dump . 분명히 localhost:5000 기본 URI가 무엇이든간에 자리 표시 자입니다. 얼마나 복잡한 지 모르겠어요 data 요청에 있지만 요청 본문의 데이터를 처리하는 방법에 관한 문서를 참조 할 수 있습니다. 이 예는 주로 라우팅 부분에 중점을 둡니다.

    이것은 간단한 예일 뿐이며 경로, 허용 된 방법 등을 지정하는 데 사용할 수있는 다양한 속성이 있습니다. 문서는 그것을 아주 잘 설명하고 많은 예제를 제공합니다. 링크는 아래에 제공됩니다. 추가 메모에서 다음 중 하나를 반환하는 것이 좋습니다. IHttpActionResult 또는 HttpResponseMessage 단순한 bool/string/int/etc 대신 유형. 반환하는 HTTP 응답 유형에 대한 더 많은 옵션을 제공 할 뿐이며 문서에도 있습니다.

    문서 : https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

  • 답변 # 2

    볼 수있는 포인트 :

    WebApi 문서를 확인하십시오. 웹 API의 404는 호스트에 연결할 수 없거나 호출중인 엔드 포인트가 잘못되었음을 의미합니다. 브라우저에 URL을 붙여 넣어 먼저 확인하십시오. POST 작업이고 컴퓨터에서 액세스 할 수있는 경우 method not supported 오류.

    브라우저에있는 경우 404가 다시 정확하지만 올바른 것을 알고있는 경우 컴퓨터의 ACL (사용자 인증 및 인증)을 조사해야합니다. 해당 머신이 네트워크에 도달/액세스 할 수 있는지 여부.

    코드에서 인증 헤더를 볼 수 없습니다. 그것도 확인하십시오.

    드물게 가능-Facebook, Google 등과 같은 사전 구성된 앱이 필요한 경우

관련 자료

  • 이전 html - stroke-dashoffset이 아닌 stroke-dasharray만을 사용하여 원형 차트를 그릴 수 있습니까?
  • 다음 AAD에 등록되지 않은 Azure 애플리케이션