IIS Express가 아닌 IIS7에서 WebApi의 { "message": "오류가 발생했습니다"}


171

ASP.NET MVC 4 WebApi로 작업하고 있으며 IIS Express의 로컬 컴퓨터에서 실행하는 데 많은 재미가 있습니다. 원격 컴퓨터에도 서비스를 제공하도록 IIS Express를 구성 했으므로 회사의 다른 회사도 내 컴퓨터를 웹 서버로 사용하고 있습니다.

이것이 최적이 아닌 솔루션이라고 결정한 후 .NET 4.5를 설치 한 후 WebApi를 원격 서버에 배치하기로 결정했습니다. 피들러를 사용하고 로컬 컴퓨터의 컨트롤러에 POST를 보내면 올바른 응답을 반환하지만 도메인을 IIS7을 실행하는 웹 서버로 변경하면 동일한 POST가 암호를 반환합니다

{ "message": "오류가 발생했습니다"}

메시지. 아무도 무슨 일이 일어나고 있는지 알고 있습니까?


2
오류 응답의 HTTP 상태 코드는 무엇입니까? 500 인 경우 웹 사이트 / 애플리케이션 구성이 IIS 7이있는 원격 시스템에 유효하지 않을 가능성이 큽니다. 원격 시스템에서 간단한 HTML 파일을 작성하고 가능하면 원격 시스템에서 파일을 찾아보고 확인하십시오. 기계에서 성공했는지 여부를 확인하십시오.
Sixto Saez

500 오류입니다. 제안에 감사하지만 WebApi가 제공하는 기본 index.html 페이지가 작동합니다. 또한 일부 API 웹 서비스는 작동하고 다른 일부는 작동하지 않는 반면 추가 할 수는 있지만 모두 로컬 컴퓨터에서 작동합니다.
nsg

2
500 오류가 표시되면 IIS 요청 추적 을 활성화 하여보다 구체적인 정보를 얻으십시오. 일반적으로 웹 API 라우팅이 시작되기 전에 500 오류가 발생하지만 코드에서 수행하는 작업으로 인해 오류가 발생할 수 있습니다. IIS 추적 로깅을보고 단서가 있는지 확인하십시오.
Sixto Saez

1
서버 시스템 자체의 브라우저에서 요청을 시작하여 (예 : 원격 데스크톱 세션 사용) 서버가 응답에 더 자세한 오류 정보를 제공 할 수 있습니다.
Jon Schneider

답변:


268

문제는 서버에 없었지만 로컬 컴퓨터에있는 종속성이 누락되었습니다. 우리의 경우에는 Devart.Data.Linq dll이었습니다.

그 대답을 얻기 위해 IIS 추적을 500 오류로 설정했습니다. 약간의 정보를 제공했지만 web.config 설정에서 실제로 도움이 된 것은 <system.web><customErrors mode="Off"/></system.web>동적으로로드 된 종속성이 누락되었음을 나타냅니다. 이 종속성을 추가하고 로컬로 복사하도록 지시하면 서버가 작동하기 시작했습니다.


33
HTTP 응답 코드가 500이고 사용자 정의 오류가 설정 될 때마다 WebAPI가 실제 응답을 { "message": "오류가 발생했습니다"}로 대체 한 것 같습니다. 포인터 주셔서 감사합니다.
Paul Suart

4
customErrors 모드 설정에 대한 좋은 제안. 이런 종류의 오류의 출력에 영향을 미치는 변경이 놀랍습니다.
Dewi Rees

1
당신은 또한으로 설정할 수 있습니다 mode="RemoteOnly"당신이 서버의 웹 브라우저에서 페이지를 실행하면 사이트의 나머지 부분은 외부에서 액세스 할 수있는 경우 당신은 또한 보안을 손상시키지 않고 오류를 볼 수 있습니다
Simon_Weaver

해당 설정을 변경할 때 이러한 종류의 오류 세부 정보를 얻는 방법에 대한 제안이 불가능합니다 (예 : API 부분이 PCI 호환 서버에서 호스팅되기 때문에 시스템 수준에서 오류가 비활성화 됨)? Elmah 설정을 시도했지만 불행히도 아무것도 기록하지 않습니다.
RubyHaus

이것이 가장 좋은 방법이며, 일반적인 방법에 대한 충분한 정보를 제공합니다.
DanielV

97

원래:

IncludeErrorDetailPolicy대신 CustomErrors해결되지 않으면 대신 사용하십시오 (예 : ASP.NET 스택이> 2012 인 경우).

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

참고 : 자세한 오류 정보를 반환하면 민감한 정보가 '해커'에게 공개 될 수 있습니다. 아래의이 답변에 대한 Simon의 의견을 참조하십시오.

TL; DR 버전

나를 위해 CustomErrors정말 도움이되지 않았습니다. 이미 (으)로 설정 Off되었지만 여전히 잘못된 an error has occurred메시지 만 받았습니다 . 나는 받아 들여진 대답이 3 년 전부터 오늘날 웹 단어에서 오랜 시간이라고 생각합니다. Web API 2와 ASP.NET 5 (MVC 5)를 사용하고 있으며 Microsoft는 IIS 전용 전략에서 멀어졌습니다.CustomErrors 졌지만 오래된 skool IIS입니다.

어쨌든, 나는 현지에서 가지고 있지 않은 생산에 문제가있었습니다. 그런 다음 개발자 컴퓨터에서와 같이 Chrome의 네트워크 탭에 오류가 표시되지 않습니다. 결국 프로덕션 서버에 Chrome을 설치 한 다음 서버 자체의 앱 (예 : 'localhost')을 탐색하여 문제를 해결했습니다. 그런 다음 스택 추적과 함께 더 자세한 오류가 나타납니다.

그 후에야 지미 보가드 ( Jimmy Bogard)에서이 기사를 찾았습니다 (참고 : 지미 AutoMapper입니다! ). 재미있는 점은 그의 기사가 2012 년이지만 기사에서 CustomErrors더 이상 도움이되지 않지만 IncludeErrorDetailPolicy전역 WebApi 구성 (예 :)에서 다르게 설정하여 '오류 세부 사항'을 변경할 수 있다고 이미 설명했습니다 WebApiConfig.cs.

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

다행히 그는 또한 webapi (2)가 귀하의 말을 듣도록 설정하는 방법을 설명합니다 CustomErrors 설정을 . 그것은 꽤 현명한 접근 방식이며 2012 : P로 돌아갈 수 있습니다.

참고 : 기본값은 'LocalOnly'이며이 게시물을 찾기 전에 설명 된 방식으로 문제를 해결할 수 있었던 이유를 설명합니다. 그러나 모든 사람이 브라우저를 프로덕션 및 시작하기 위해 원격으로 할 수는 없다는 것을 이해합니다 (저는 프리랜서 및 DevOps로 가기로 결정하기 전까지는 불가능했습니다).


2
자, 이것은 작동합니다. 감사합니다! 빌드 서버에서는 실패하지만 로컬에서는 그렇지 않은 메모리 내 통합 owin 종류의 테스트가 있습니다. 시작 클래스 에서이 설정을 사용하면 이유를 알 수 있습니다.
Thomas Eyde

customError 설정은 Microsoft.AspNet.WebApi.WebHost를 통해 IIS에서 호스팅 될 때 WebApi 2에서 작동하는 것으로 보입니다. 패키지는 버전 5.2.3이므로 ASP.NET 스택은 2012 년을지나갑니다. Off로 설정하면 웹 API가 일반 오류에서 호출 스택 등을 포함하여보다 상세하게 전환됩니다.
Tom

4
민감한 정보를 '해커'에게 공개 할 수 있으므로 신중하게 설정하십시오. 나는 종종 이와 같은 if (DateTime.Now < new DateTime(2017, 6, 22)) { .... }옵션을 설정하는 것과 같은 빠른 해킹을 할 것 입니다. 그런 다음 프로덕션에서 테스트 할 수 있으며 내일은 비활성화하는 것을 잊어 버린 경우 마술처럼 정상적인 동작으로 되돌아갑니다.
Simon_Weaver 2016 년

36

다른 답변들 중 어느 것도 나를 위해 일하지 않았습니다.

이것은 : (Startup.cs에서)

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();

        WebApiConfig.Register(config);

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

또는 WebApiConfig.cs에 넣을 수 있습니다.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

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

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

예!, 이것이 Mono / Linux에서 유일하게 작동하는 솔루션이었습니다.
Robert II

이것은 IIS와 Windows Server에서 내부적으로 제공되는 앱을 위해 나에게 도움이되었습니다.
Paul Carlton

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 나 문맥이 배치 되었기 때문에 내가 구문 분석 할 수없는 엔티티의 인스턴스를 반환 찾을 도왔 감사합니다
Jood jindy

12

테스트 환경에서 오류가 발생하면 항상이 질문에 도달하고 "이전에 해본 적이 있지만 코드를 수정하고 테스트 환경에 다시 배포하지 않고도 web.config에서 바로 수행 할 수 있습니다. , 그러나 2 가지 변경이 필요합니다 ... 다시 무엇입니까? "

향후 참조를 위해

<system.web>
   <customErrors mode="Off"></customErrors>
</system.web>

<system.webServer>
  <httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>

11

WebAPI 끝점에 게시 할 때 비슷한 문제가 발생했습니다. CustomErrors = Off를 설정하면 dll 중 하나 인 실제 오류를 볼 수있었습니다.


10

누군가에게 도움이되는 경우 :

비슷한 문제가 있었고 Nates 지침에 따라 추가했습니다.

<system.web>
     <customErrors mode="Off"/>
 </system.web>

이것은 오류에 대한 자세한 정보를 보여줍니다.

"ExceptionMessage": "지정된 메타 데이터 리소스를로드 할 수 없습니다.", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": "at System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResource .LoadResources (...

이것은 내가 edmx 파일을 다른 위치로 옮겼고 구성에서 연결 문자열 노드를 변경하는 것을 잊었 음을 기억할 때입니다 (connectionsstrings 노드는 "configSource"를 사용하여 별도의 파일에 배치되었지만 다른 이야기입니다).


asp.net의 웹 API에 OData와 AutoMapper를 추가 할 때 이런 일이 일어났습니다.이 키워드는 누군가가이 게시물에 도달하는 데 도움이되고 try / catch가 저의 경우에는 작동하지 않아서 결과가 나올 수밖에 없었습니다.
Ekus

0

내 swagger XML 파일이 \ bin에 배포되지 않았습니다.

GlobalConfiguration.Configuration
  .EnableSwagger(c =>
  {
    c.SingleApiVersion("v1", "SwaggerDemoApi");
    c.IncludeXmlComments(string.Format(@"{0}\bin\SwaggerDemoApi.XML", 
                         System.AppDomain.CurrentDomain.BaseDirectory));
    c.DescribeAllEnumsAsStrings();
  })

http://wmpratt.com/swagger-and-asp-net-web-api-part-1/

여기에 이미지 설명을 입력하십시오

릴리스 구성과 디버그 구성에서 설정해야했습니다.


0

당신이있는 경우 <deployment retail="true"/>귀하의 .NET 프레임 워크의 machine.config에, 당신은 자세한 오류 메시지가 표시되지 않습니다. 설정이 거짓인지 또는 존재하지 않는지 확인하십시오.


0

그래서 나는 제안 된 모든 해결책을 시도했지만 아무 소용이 없습니다. 내가 한 것은 서버에서 응용 프로그램을 실행하도록 설정하고 오류가 완전히 표시 된 것입니다 .customErrors 모드를 false로 설정했을 때 작동했지만 작동하지 않았습니다. 서버에서 API를 탐색하는 순간 서버에서 문제를 볼 수있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.