{Tin nhắn của WebApi ': Lỗi đã xảy ra lỗi} trên IIS7, không phải trong IIS Express


171

Tôi đang làm việc với ASP.NET MVC 4 WebApi và đang có rất nhiều niềm vui với nó chạy nó trên máy tính cục bộ của tôi trên IIS Express. Tôi cũng đã cấu hình IIS Express để phục vụ các máy từ xa và vì vậy các công ty khác trong công ty của tôi đang sử dụng máy tính của tôi làm máy chủ web của chúng tôi.

Sau khi quyết định đây là một giải pháp kém tối ưu, chúng tôi đã quyết định đưa WebApi lên một máy chủ từ xa sau khi cài đặt .NET 4.5. Khi tôi sử dụng fiddler và gửi POST cho bộ điều khiển trên máy cục bộ của mình, nó sẽ trả về đúng phản hồi, nhưng khi tôi thay đổi tên miền sang máy chủ web chạy IIS7 thì POST sẽ trả lại một mật mã

{"tin nhắn": "đã xảy ra lỗi"}

thông điệp. Bất cứ ai có bất kỳ ý tưởng những gì có thể xảy ra?


2
Mã trạng thái HTTP trên phản hồi lỗi là gì? Nếu là 500 thì rất có thể cấu hình trang web / ứng dụng không hợp lệ đối với máy từ xa có IIS 7. Tạo một tệp HTML đơn giản trên máy từ xa, duyệt nó trên máy từ xa nếu có thể để đảm bảo có thể xem được rồi thử để đánh nó từ máy của bạn để xem nó có thành công hay không.
Sixto Saez

Đó là một lỗi 500. Cảm ơn đề xuất, nhưng trang index.html mặc định mà WebApi cung cấp hoạt động. Cũng nên thêm rằng một số dịch vụ web API hoạt động và những dịch vụ khác thì không, trong khi tất cả chúng hoạt động trên máy cục bộ của tôi.
NSG

2
Bạn sẽ cần bật theo dõi yêu cầu IIS để có thêm thông tin cụ thể khi bạn thấy lỗi 500. Một lỗi 500 thường xảy ra trước khi định tuyến API Web khởi động nhưng tôi đoán có thể kích hoạt nó bằng một cái gì đó mà mã của bạn đang thực hiện. Nhìn vào bản ghi theo dõi IIS và xem nếu nó cung cấp bất kỳ manh mối.
Sixto Saez

1
Bạn có thể yêu cầu máy chủ cung cấp cho bạn nhiều thông tin lỗi dài dòng hơn trong phản hồi của nó bằng cách khởi tạo yêu cầu từ trình duyệt trên chính máy chủ (ví dụ: sử dụng phiên Remote Desktop).
Jon Schneider

Câu trả lời:


268

Vấn đề là sự phụ thuộc bị thiếu không có trên máy chủ mà là ở máy cục bộ của tôi. Trong trường hợp của chúng tôi, đó là một Devart.Data.Linq dll.

Để có được câu trả lời đó, tôi đã bật truy tìm IIS cho 500 lỗi. Điều đó đã cung cấp một ít thông tin, nhưng điều thực sự hữu ích là trong cài đặt web.config <system.web><customErrors mode="Off"/></system.web>Điều này chỉ ra một phụ thuộc được tải động. Sau khi thêm phụ thuộc này và bảo nó được sao chép cục bộ, máy chủ bắt đầu hoạt động.


33
Có vẻ như WebAPI sẽ thay thế {"message": "đã xảy ra lỗi"} cho phản hồi thực bất cứ khi nào mã phản hồi HTTP là 500 và lỗi tùy chỉnh được bật. Cảm ơn con trỏ.
Paul Suart

4
Đề xuất tuyệt vời về cài đặt chế độ tùy chỉnh Gương. Tôi cho rằng việc thay đổi có tác động đến đầu ra của các loại lỗi này.
Dewi Rees

1
bạn cũng có thể đặt nó mode="RemoteOnly"và nếu bạn chạy trang trên webbrowser trên máy chủ, bạn cũng sẽ thấy các lỗi mà không ảnh hưởng đến bảo mật nếu phần còn lại của trang web có thể truy cập được bên ngoài
Simon_Weaver

Bất kỳ đề xuất nào về cách nhận loại chi tiết lỗi này khi thay đổi cài đặt đó là không thể (ví dụ: lỗi bị tắt ở cấp độ máy vì phần API được lưu trữ trên máy chủ tương thích PCI)? Tôi đã thử thiết lập Elmah, nhưng nó không đăng nhập bất cứ điều gì đáng tiếc.
RubyHaus

Đây là cách tiếp cận tốt nhất, cung cấp đủ thông tin về một phương pháp chung như vậy.
DanielV

97

Về cơ bản:

Sử dụng IncludeErrorDetailPolicythay thế nếu CustomErrorskhông giải quyết nó cho bạn (ví dụ: nếu bạn là ngăn xếp ASP.NET> 2012):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Lưu ý: Cẩn thận trả lại thông tin lỗi chi tiết có thể tiết lộ thông tin nhạy cảm cho 'tin tặc'. Xem bình luận của Simon về câu trả lời này dưới đây.

Phiên bản TL; DR

Đối với tôi CustomErrorskhông thực sự giúp đỡ. Nó đã được đặt thành Off, nhưng tôi vẫn chỉ nhận được một an error has occurredtin nhắn sởi . Tôi đoán câu trả lời được chấp nhận là từ 3 năm trước đây là một thời gian dài trong từ web ngày nay. Tôi đang sử dụng Web API 2 và ASP.NET 5 (MVC 5) và Microsoft đã chuyển khỏi chiến lược chỉ sử dụng IIS, trong khi đó CustomErrorslà IIS skool cũ;).

Dù sao, tôi đã có một vấn đề về sản xuất mà tôi không có tại địa phương. Và sau đó tìm thấy tôi không thể thấy các lỗi trong tab Mạng của Chrome như tôi có thể trên máy dev của mình. Cuối cùng, tôi đã giải quyết nó bằng cách cài đặt Chrome trên máy chủ sản xuất của mình và sau đó duyệt đến ứng dụng trên máy chủ đó (ví dụ: 'localhost'). Sau đó, lỗi chi tiết hơn xuất hiện với dấu vết ngăn xếp và tất cả.

Chỉ sau đó tôi mới tìm thấy bài viết này từ Jimmy Bogard (Lưu ý: Jimmy là ông AutoMapper! ). Điều buồn cười là bài viết của anh ấy cũng từ năm 2012, nhưng trong đó anh ấy đã giải thích rằng điều CustomErrorsđó không giúp ích gì cho vấn đề này nữa, nhưng bạn CÓ THỂ thay đổi 'Chi tiết lỗi' bằng cách đặt khác biệt IncludeErrorDetailPolicytrong cấu hình WebApi toàn cầu (ví dụ WebApiConfig.cs):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

May mắn thay, anh ta cũng giải thích cách thiết lập webapi (2) DOES lắng nghe CustomErrorscài đặt của bạn . Đó là một cách tiếp cận khá hợp lý và điều này cho phép bạn quay trở lại năm 2012: P.

Lưu ý: Giá trị mặc định là 'LocalOnly', điều này giải thích tại sao tôi có thể giải quyết vấn đề theo cách tôi đã mô tả trước khi tìm thấy bài đăng này. Nhưng tôi hiểu rằng không phải ai cũng có thể từ xa để sản xuất và khởi động trình duyệt (tôi biết tôi hầu như không thể cho đến khi tôi quyết định đi làm tự do VÀ DevOps).


2
Bây giờ, điều này hoạt động. Cảm ơn bạn! Tôi có một số loại thử nghiệm tích hợp trong bộ nhớ-owin-failin trên máy chủ xây dựng, nhưng không phải cục bộ. Với cài đặt này trong lớp khởi động, tôi có thể có cơ hội tìm hiểu tại sao.
Thomas Eyde

Dường như cài đặt customError hoạt động với WebApi 2 khi được lưu trữ trong IIS thông qua Microsoft.AspNet.WebApi.Webhost. Các gói là phiên bản 5.2.3, do đó, ngăn xếp ASP.NET đã qua năm 2012. Bằng cách đặt nó thành Tắt, api web chuyển từ lỗi chung sang chi tiết hơn, có chứa ngăn xếp cuộc gọi, v.v ...
Tom

4
Hãy cẩn thận cài đặt này vì nó có thể tiết lộ thông tin nhạy cảm cho 'tin tặc'. Tôi sẽ thường xuyên hack nhanh một cái gì đó như if (DateTime.Now < new DateTime(2017, 6, 22)) { .... }để đặt một tùy chọn như thế này. Sau đó tôi có thể kiểm tra nó trong sản xuất và ngày mai nó sẽ quay trở lại hoạt động bình thường nếu tôi quên vô hiệu hóa nó.
Simon_Weaver

36

Không có câu trả lời nào khác làm việc cho tôi.

Điều này đã làm: (trong Startup.cs)

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

        WebApiConfig.Register(config);

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

(hoặc bạn có thể đặt nó trong 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;
    }
}

Có!, Đây là giải pháp hoạt động duy nhất cho tôi trên Mono / Linux.
Robert II

Điều này làm việc cho tôi trên prod cho một ứng dụng được phục vụ nội bộ trên IIS và Windows Server.
Paul Carlton

config.IncludeErrorDetailPolicy = Bao gồmErrorDetailPolicy.Always; đã giúp tôi thấy rằng tôi trả lại một thể hiện của một thực thể không thể phân tích cú pháp vì bối cảnh đã được xử lý cảm ơn bạn
Jood jindy

12

Tôi luôn gặp phải câu hỏi này khi gặp lỗi trong môi trường kiểm tra và nhớ rằng: "Tôi đã làm điều này trước đây, nhưng tôi có thể làm điều đó ngay trong web.config mà không phải sửa đổi mã và triển khai lại vào môi trường kiểm tra , nhưng phải mất 2 thay đổi ... lại là gì? "

Để tham khảo trong tương lai

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

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

11

Tôi đã gặp một vấn đề tương tự khi đăng lên điểm cuối WebAPI. Bằng cách tắt CustomErrors = Off, tôi có thể thấy lỗi thực tế là một trong những dll bị thiếu.


10

Trong trường hợp điều này giúp bất cứ ai:

Tôi gặp vấn đề tương tự và làm theo hướng dẫn của Nates tôi đã thêm:

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

Điều này cho tôi biết thêm thông tin về lỗi:

"ExceptionMessage": "Không thể tải tài nguyên siêu dữ liệu đã chỉ định.", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": "tại System.Data.Entity.Core.Metadata.Edm.MetadataArtifact .LoadResource (...

Đây là khi tôi nhớ rằng tôi đã di chuyển tệp edmx sang một vị trí khác và quên thay đổi nút kết nối trong cấu hình (nút kết nối được đặt trong một tệp riêng biệt bằng cách sử dụng "configSource", nhưng đó là một câu chuyện khác).


Điều này xảy ra với tôi khi thêm OData và AutoMapper đến một api web trong asp.net - hy vọng các từ khóa này giúp đỡ ai đó đạt được bài này, và cố gắng / catch không làm việc trong trường hợp của tôi vì vậy tôi đã phải xem kết quả thô
Ekus

0

Tệp XML vênh vang của tôi không được triển khai vào \ 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/

nhập mô tả hình ảnh ở đây

Nó phải được đặt trong Cấu hình phát hành cũng như trong Cấu hình gỡ lỗi.


0

Nếu bạn có <deployment retail="true"/>trong machine.config của .NET Framework, bạn sẽ không thấy các thông báo lỗi chi tiết. Đảm bảo rằng cài đặt là sai hoặc không có.


0

Vì vậy, tôi đã thử tất cả các giải pháp được đề xuất vô ích. Tất cả những gì tôi đã làm là thiết lập chạy ứng dụng từ máy chủ và nó hiển thị đầy đủ lỗi, điều này sẽ hoạt động khi tôi đặt chế độ customErrors thành false nhưng không được. Khoảnh khắc tôi duyệt mẫu API máy chủ tôi có thể thấy vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.