{“ ข้อความ” ของ WebApi:“ เกิดข้อผิดพลาด”} บน IIS7 ไม่ใช่ใน IIS Express


171

ฉันทำงานกับ ASP.NET MVC 4 WebApi และสนุกไปกับมันที่ใช้งานบนคอมพิวเตอร์ในท้องถิ่นของฉันบน IIS Express ฉันได้กำหนดค่า IIS Express เพื่อให้บริการเครื่องระยะไกลด้วยและอื่น ๆ ใน บริษัท ของฉันกำลังใช้คอมพิวเตอร์เป็นเว็บเซิร์ฟเวอร์ของเรา

หลังจากตัดสินใจว่านี่เป็นวิธีการแก้ปัญหาที่ดีที่สุดเราตัดสินใจวาง WebApi บนเซิร์ฟเวอร์ระยะไกลหลังจากติดตั้ง. NET 4.5 เมื่อฉันใช้พู้ทำเล่นและส่ง POST ไปยังตัวควบคุมบนเครื่องท้องถิ่นของฉันมันจะส่งคืนการตอบสนองที่ถูกต้อง แต่เมื่อฉันเปลี่ยนโดเมนเป็นเว็บเซิร์ฟเวอร์ที่รัน IIS7 POST เดียวกันจะส่งกลับเป็นความลับ

{"message": "เกิดข้อผิดพลาด"}

ข่าวสาร มีใครมีความคิดว่าจะเกิดอะไรขึ้น?


2
รหัสสถานะ HTTP ในการตอบสนองข้อผิดพลาดคืออะไร ถ้าเป็น 500 มีโอกาสมากที่การกำหนดค่าเว็บไซต์ / แอปพลิเคชันไม่ถูกต้องสำหรับเครื่องระยะไกลที่มี IIS 7 สร้างไฟล์ HTML อย่างง่ายบนเครื่องระยะไกลเรียกดูบนเครื่องระยะไกลหากเป็นไปได้เพื่อให้แน่ใจว่าสามารถดูได้ เพื่อเข้าชมจากเครื่องของคุณเพื่อดูว่าสำเร็จหรือไม่
Sixto Saez

มันเป็นข้อผิดพลาด 500 ข้อ ขอขอบคุณสำหรับข้อเสนอแนะ แต่หน้า index.html เริ่มต้นที่ WebApi มีให้ใช้งานได้ ควรเพิ่มว่าเว็บเซอร์วิส API บางตัวใช้งานได้และบางเว็บไม่ทำงานในขณะที่ทั้งหมดนั้นทำงานบนเครื่องท้องถิ่นของฉัน
nsg

2
คุณจะต้องเปิดใช้งานการติดตาม IISเพื่อขอข้อมูลเฉพาะเพิ่มเติมเมื่อคุณเห็นข้อผิดพลาด 500 ข้อผิดพลาด 500 มักจะเกิดขึ้นก่อนที่การกำหนดเส้นทางเว็บ API จะเริ่มขึ้น แต่ฉันเดาว่าเป็นไปได้ที่จะทริกเกอร์โดยสิ่งที่รหัสของคุณกำลังทำอยู่ ดูการบันทึกการติดตาม IIS และดูว่ามีเบาะแสใด ๆ
Sixto Saez

1
คุณอาจได้รับเซิร์ฟเวอร์เพื่อให้ข้อมูลข้อผิดพลาด verbose เพิ่มเติมในการตอบสนองของมันโดยเริ่มต้นการร้องขอจากเบราว์เซอร์บนเครื่องเซิร์ฟเวอร์เอง (เช่นใช้เซสชันเดสก์ท็อประยะไกล)
Jon Schneider

คำตอบ:


268

ปัญหาคือการพึ่งพาที่ขาดหายไปซึ่งไม่ได้อยู่บนเซิร์ฟเวอร์ แต่อยู่ในเครื่องของฉัน ในกรณีของเรามันเป็น Devart.Data.Linq dll

เพื่อให้ได้คำตอบนั้นฉันเปิดการสืบค้นกลับ IIS สำหรับข้อผิดพลาด 500 นั่นให้ข้อมูลเล็กน้อย แต่สิ่งที่มีประโยชน์จริงๆคือในการตั้งค่า web.config สิ่ง<system.web><customErrors mode="Off"/></system.web>นี้ชี้ไปที่การพึ่งพาการโหลดแบบไดนามิกหายไป หลังจากเพิ่มการพึ่งพานี้และบอกให้คัดลอกแบบโลคัลเซิร์ฟเวอร์เริ่มทำงาน


33
ดูเหมือนว่า WebAPI จะแทนที่ {"message": "เกิดข้อผิดพลาด"} สำหรับการตอบสนองที่แท้จริงเมื่อใดก็ตามที่โค้ดการตอบสนอง HTTP คือ 500 และข้อผิดพลาดที่กำหนดเองเปิดอยู่ ขอบคุณสำหรับตัวชี้
Paul Suart

4
ข้อเสนอแนะที่ดีเกี่ยวกับการตั้งค่าโหมด customErrors ฉันประหลาดใจที่การเปลี่ยนแปลงที่ส่งผลกระทบต่อผลลัพธ์ของข้อผิดพลาดประเภทนี้
Dewi Rees

1
คุณยังสามารถตั้งค่าเป็นmode="RemoteOnly"และหากคุณเรียกใช้หน้าเว็บบนเว็บเบราว์เซอร์บนเซิร์ฟเวอร์คุณจะเห็นข้อผิดพลาดโดยไม่สูญเสียความปลอดภัยหากส่วนที่เหลือของไซต์สามารถเข้าถึงได้จากภายนอก
Simon_Weaver

คำแนะนำใด ๆ เกี่ยวกับวิธีรับรายละเอียดข้อผิดพลาดชนิดนี้เมื่อเปลี่ยนการตั้งค่านั้นเป็นไปไม่ได้ (เช่นข้อผิดพลาดถูกปิดใช้งานที่ระดับเครื่องเนื่องจากส่วน API โฮสต์บนเซิร์ฟเวอร์ที่เข้ากันได้กับ PCI) ฉันลองตั้งค่า Elmah แล้ว แต่ก็ไม่ได้บันทึกอะไรที่น่าเสียดาย
RubyHaus

นี่เป็นวิธีที่ดีที่สุดให้ข้อมูลที่เพียงพอกับวิธีการทั่วไป
DanielV

97

โดยทั่วไป:

ใช้IncludeErrorDetailPolicyแทนหากCustomErrorsไม่สามารถแก้ได้สำหรับคุณ (เช่นถ้าคุณเป็น ASP.NET stack คือ> 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 เหมือนที่ฉันทำได้ในเครื่อง dev ของฉัน ในที่สุดฉันก็สามารถแก้ไขได้โดยการติดตั้ง Chrome บนเซิร์ฟเวอร์ที่ใช้งานจริงของฉันและจากนั้นเรียกดูแอปที่อยู่บนเซิร์ฟเวอร์นั้นเอง (เช่น 'localhost') จากนั้นข้อผิดพลาดโดยละเอียดเพิ่มเติมปรากฏขึ้นพร้อมกับร่องรอยสแต็กและทั้งหมด

หลังจากนั้นฉันก็พบบทความนี้จาก Jimmy Bogard (หมายเหตุ: Jimmy is mr. AutoMapper! ) สิ่งที่ตลกคือบทความของเขานั้นมาจาก 2012 แต่ในนั้นเขาอธิบายแล้วCustomErrorsว่าไม่ได้ช่วยอะไรอีกต่อไป แต่คุณสามารถเปลี่ยน 'รายละเอียดข้อผิดพลาด' โดยการตั้งค่าที่แตกต่างIncludeErrorDetailPolicyในการกำหนดค่า WebApi ทั่วโลก (เช่นWebApiConfig.cs):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

โชคดีที่เขายังอธิบายวิธีตั้งค่า webapi ที่ (2) ฟังการCustomErrorsตั้งค่าของคุณ นั่นเป็นวิธีการที่สมเหตุสมผลและสิ่งนี้ช่วยให้คุณย้อนกลับไปยังปี 2555: P

หมายเหตุ: ค่าเริ่มต้นคือ 'LocalOnly' ซึ่งอธิบายถึงสาเหตุที่ฉันสามารถแก้ไขปัญหาในแบบที่ฉันอธิบายก่อนที่จะค้นหาโพสต์นี้ แต่ฉันเข้าใจว่าทุกคนไม่สามารถห่างไกลจากการผลิตและเริ่มต้นเบราว์เซอร์ (ฉันรู้ว่าฉันไม่สามารถทำได้จนกว่าฉันจะตัดสินใจอิสระและ DevOps)


2
ตอนนี้ใช้งานได้ ขอบคุณ! ฉันมีการทดสอบในหน่วยความจำ - การรวม - แบบ owin ซึ่งล้มเหลวในการสร้างเซิร์ฟเวอร์ แต่ไม่ใช่ในเครื่อง ด้วยการตั้งค่านี้ในระดับเริ่มต้นของฉันฉันอาจมีโอกาสรู้ว่าทำไม
โทมัส Eyde

ปรากฏว่าการตั้งค่า customError ทำงานร่วมกับ WebApi 2 เมื่อโฮสต์ใน IIS ผ่าน Microsoft.AspNet.WebApi.WebHost แพ็คเกจเป็นรุ่น 5.2.3 ดังนั้น ASP.NET stack ที่ผ่านมาในปี 2012 โดยการตั้งค่าเป็น Off เว็บ api จะเปลี่ยนจากข้อผิดพลาดทั่วไปเป็นรายละเอียดเพิ่มเติมประกอบด้วย call stack ฯลฯ ...
Tom

4
ระวังการตั้งค่านี้เพราะสามารถเปิดเผยข้อมูลที่สำคัญต่อ 'แฮกเกอร์' ฉันมักจะทำแฮ็คอย่างรวดเร็วif (DateTime.Now < new DateTime(2017, 6, 22)) { .... }เพื่อตั้งค่าตัวเลือกเช่นนี้ จากนั้นฉันสามารถทดสอบในการผลิตและในวันพรุ่งนี้มันจะกลับไปใช้พฤติกรรมปกติอย่างน่าอัศจรรย์หากฉันลืมปิดการใช้งาน
Simon_Weaver

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

สิ่งนี้ใช้ได้กับฉันใน prod สำหรับแอปที่ให้บริการภายในบน 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 endpoint โดยการเปลี่ยน CustomErrors = Off ฉันก็สามารถดูข้อผิดพลาดจริงซึ่งเป็นหนึ่งในที่กำลังหายไป


10

ในกรณีนี้จะช่วยให้ทุกคน:

ฉันมีปัญหาที่คล้ายกันและทำตามคำแนะนำของ Nates ที่ฉันเพิ่ม:

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

นี่แสดงข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดให้ฉัน:

"ExceptionMessage": "ไม่สามารถโหลดทรัพยากรเมตาดาต้าที่ระบุ", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": "ที่ System.Data.Entity.Core.MetadataArtifactLoaderCompositeResource .LoadResources ( ...

นี่คือตอนที่ฉันจำได้ว่าฉันได้ย้ายไฟล์ edmx ไปยังตำแหน่งอื่นและลืมที่จะเปลี่ยนโหนดการเชื่อมต่อในการตั้งค่า (โหนดการเชื่อมต่อถูกวางไว้ในไฟล์แยกโดยใช้ "configSource" แต่นั่นเป็นเรื่องอื่น)


เรื่องนี้เกิดขึ้นกับผมเมื่อมีการเพิ่ม OData และ AutoMapper เพื่อ API เว็บใน asp.net - หวังคำหลักเหล่านี้ช่วยเหลือใครบางคนถึงการโพสต์นี้และลอง / จับไม่ได้ทำงานในกรณีของฉันเพื่อให้ฉันได้เห็นผลดิบ
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"/>machine.config ใน. NET Framework คุณจะไม่เห็นข้อความแสดงข้อผิดพลาดโดยละเอียด ตรวจสอบให้แน่ใจว่าการตั้งค่าเป็นเท็จหรือไม่มีอยู่


0

ดังนั้นฉันจึงลองวิธีแก้ปัญหาที่แนะนำทั้งหมดเพื่อประโยชน์ ทั้งหมดที่ฉันทำคือตั้งค่าให้เรียกใช้แอปจากเซิร์ฟเวอร์และแสดงข้อผิดพลาดทั้งหมดซึ่งควรจะทำงานเมื่อฉันตั้งค่าโหมด customErrors เป็นเท็จ แต่ไม่ได้ ขณะที่ฉันเรียกดู API จากเซิร์ฟเวอร์ที่ฉันสามารถดูปัญหาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.