ไม่สามารถโหลดไฟล์หรือชุดประกอบ System.Web.Http.WebHost หลังจากเผยแพร่ไปยังเว็บไซต์ Azure


141

ฉันสร้างโครงการเว็บและทำงานได้ดีใน Visual Studio อย่างไรก็ตามฉันได้รับข้อผิดพลาดต่อไปนี้หลังจากเผยแพร่ไปยังเว็บไซต์ azurewebsites สิ่งที่สามารถทำให้เกิดปัญหา?

ไม่สามารถโหลดไฟล์หรือชุดประกอบ 'System.Web.Http.WebHost, เวอร์ชัน = 5.0.0.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = 31bf3856ad364e35' หรือการอ้างอิงอย่างใดอย่างหนึ่ง คำจำกัดความรายการของชุดประกอบที่อยู่ไม่ตรงกับการอ้างอิงชุดประกอบ (ข้อยกเว้นจาก HRESULT: 0x80131040)

คำอธิบาย: มีข้อยกเว้นที่ไม่สามารถจัดการได้เกิดขึ้นระหว่างการดำเนินการตามคำขอเว็บปัจจุบัน โปรดตรวจสอบการติดตามสแต็กสำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดและที่มาในรหัส

รายละเอียดข้อยกเว้น: System.IO.FileLoadException: ไม่สามารถโหลดไฟล์หรือชุดประกอบ 'System.Web.Http.WebHost, เวอร์ชัน = 5.0.0.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = 31bf3856ad364e35' หรือหนึ่งในการขึ้นต่อกันของมัน คำจำกัดความรายการของชุดประกอบที่อยู่ไม่ตรงกับการอ้างอิงชุดประกอบ (ข้อยกเว้นจาก HRESULT: 0x80131040)

ข้อผิดพลาดของแหล่งที่มา:

ข้อยกเว้นที่ไม่สามารถจัดการได้ถูกสร้างขึ้นระหว่างการดำเนินการตามคำขอเว็บปัจจุบัน ข้อมูลเกี่ยวกับที่มาและตำแหน่งของข้อยกเว้นสามารถระบุได้โดยใช้การติดตามสแต็กข้อยกเว้นด้านล่าง

การติดตามการโหลดแอสเซมบลี: ข้อมูลต่อไปนี้มีประโยชน์ในการระบุสาเหตุที่แอสเซมบลี 'System.Web.Http.WebHost, เวอร์ชัน = 5.0.0.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = 31bf3856ad364e35' ไม่สามารถโหลดได้

WRN: การบันทึกการรวมแอสเซมบลีถูกปิด เมื่อต้องการเปิดใช้งานการบันทึกการเชื่อมต่อล้มเหลวของชุดประกอบให้ตั้งค่ารีจิสทรี [HKLM \ Software \ Microsoft \ Fusion! EnableLog] (DWORD) เป็น 1 หมายเหตุ: มีการปรับประสิทธิภาพบางอย่างที่เกี่ยวข้องกับการบันทึกความล้มเหลวของชุดประกอบผูก หากต้องการปิดคุณสมบัตินี้ให้ลบค่ารีจิสตรี [[HKLM \ Software \ Microsoft \ Fusion! EnableLog]

ต่อไปนี้เป็นส่วนหนึ่งของไฟล์ web.config

  <system.web>
    <customErrors mode="Off"/>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
  <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers></system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

คำตอบ:


129

dllขาดหายไปใน (สภาพแวดล้อมการใช้งาน) ที่เผยแพร่ นั่นคือเหตุผลที่มันทำงานในท้องถิ่นเช่น Visual Studio แต่ไม่ได้อยู่ใน Azure Website Environment

เพียงทำCopy Local = trueในคุณสมบัติสำหรับแอสเซมบลี ( System.Web.Http.WebHost ) และจากนั้นทำการปรับใช้ใหม่ก็ควรทำงานได้ดี

หากคุณได้รับข้อผิดพลาดที่คล้ายกันเช่นมีบางแอสเซมบลีที่หายไปให้ทำการแอสเซมบลีนั้นเพื่อ copylocal = true และ redeploy ทำซ้ำนี้ซ้ำ - ถ้าคุณไม่แน่ใจของการอ้างอิง


2
Copy Localอยู่แล้วทรู น่าแปลกที่มันแสดงว่าRuntime Versionเป็น v4.0.30319 แทนที่จะเป็น v5?
ca9163d9

4
คุณรู้ไหมว่าเกิดอะไรขึ้นที่นี่ ฉันทำงานได้ดีเป็นเวลา 18 เดือนเมื่อสิ่งนี้กระโดดและทำให้ฉัน
Glenn Gordon

2
นี่แก้ไขปัญหาให้ฉันขอบคุณ! แต่มันแปลกสำหรับฉันที่เราต้องรวมเฟรมเวิร์กไลบรารีในโครงการของเรา (ในกรณีของฉันไม่ใช่ Azure แต่เป็นเซิร์ฟเวอร์ IIS) มีใครรู้บ้างว่าเป็นกรณีของการเรียกใช้การอัปเดตบางอย่างหรือไม่
edgarpetrauskas

1
Mini Add-on เนื่องจากฉันใช้เวลาตลอดไปในการค้นหา copy local: ใน VS2013 คุณเปิดโหนด "การอ้างอิง" ในโครงการและคลิกขวา -> คุณสมบัติในไลบรารีที่คุณต้องการตั้งค่า "copy local"
ArtHare

6
หาก Copy Local ถูกตั้งค่าเป็น True และคุณไม่สามารถอัปเดต WebApi ได้เนื่องจากมีการพึ่งพามีกลอุบายในการตั้งค่า Copy Local เป็นเท็จสร้างจากนั้นตั้งค่า Copy Local กลับเป็นจริงและสร้าง ฉันไม่รู้ว่าทำไมมันถึงใช้ได้
DeeArgee

90

หากคุณยังคงต้องการคำตอบลองตรวจสอบกระทู้คำถามนี้ มันช่วยฉันแก้ปัญหาที่คล้ายกัน

แก้ไข: โซลูชันที่ช่วยฉันก็คือเรียกใช้Update-Package Microsoft.AspNet.WebApi -reinstallจากผู้จัดการแพคเกจ NugGet ตามที่ Pathoschild แนะนำ ฉันต้องลบไฟล์. suo ของฉันแล้วรีสตาร์ท VS ตามที่ Sergey Osypchuk แนะนำในกระทู้นี้


โปรดหลีกเลี่ยงลิงก์คำตอบเท่านั้น .. โปรดโพสต์ข้อมูลที่เกี่ยวข้องจากลิงค์ด้านบนที่นี่ ..
Anvesh Yalamarthy

3
การเรียกใช้คำสั่งปรับปรุงแพคเกจแก้ไขปัญหาในขณะที่ไม่มีคำแนะนำอื่น ๆ ที่ใช้งานได้ ขอบคุณสำหรับคำตอบ!
DigiOz Multimedia

ทางออกที่ดีที่สุดในการแก้ไขปัญหา
Festim Cahani

คำตอบที่สมบูรณ์แบบขอบคุณ!
Apolo

3
วิธีนี้ใช้ได้ผลสำหรับฉันด้วย ฉันค่อนข้างแน่ใจว่าสิ่งนี้มีสาเหตุมาจากฟังก์ชั่น 'Remove Unused Assemblies' ของ ReSharper ลบแอสเซมบลีที่ไม่ได้ใช้บางครั้งเอาแอสเซมบลีที่สุ่มโดยไม่ตรวจสอบเนื้อหาแพคเกจ NuGet
Joe King

54

ฉันพบปัญหาเดียวกันและแก้ไขโดยการตั้งค่าCopyLocalเป็นจริงสำหรับ libs ต่อไปนี้:

System.Web.Http.dll
System.Web.Http.WebHost.dll
System.Net.Http.Formatting.dll

ฉันต้องเพิ่มว่าฉันใช้ MVC4 และ NET 4


ขอบคุณนี่มีประโยชน์ คุณรู้หรือไม่ว่าทำไมไฟล์เหล่านี้ไม่ได้อยู่ใน GAC? เป็นเพราะเว็บไซต์ต่าง ๆ สามารถใช้ดอทเน็ตเฟรมเวิร์กอื่น ๆ ได้หรือไม่?
dellyjm

อย่างที่ฉันจำได้ว่าปัญหานี้เกิดขึ้นเนื่องจาก Microsoft ใช้การแก้ไขที่สำคัญในพื้นที่นั้น (ฉันเดาใน System.Web / ASP NET / MVC) ฉันเดาว่าเนมสเปซเหล่านี้ไม่ได้อยู่ใน GAC (ไม่ใช่ในแอสเซมบลี NET ดั้งเดิม) แต่อยู่ในเส้นทาง Visual Studio หรือ MVC แยกกัน
Bronek

วิธีนี้แก้ไขปัญหาใน VPS ของฉัน (นี่ไม่ได้เป็นเพียงปัญหาสีน้ำเงิน)
Evilripper

สิ่งนี้ใช้ได้สำหรับฉัน (แม้ว่าฉันไม่ได้ใช้ Azure) ฉันกำลังย้ายโครงการจาก. NET Framework 4.5 ลงไปที่ 4.0 และได้รับปัญหานี้ในตอนท้ายของทุกสิ่ง
TheQ

1
ตามคำแนะนำของ DeeArgee ข้างต้นฉันมี LOCAL COPY = true สำหรับทั้ง 3 ตัวของ dll เหล่านี้แล้ว แต่ข้อเสนอแนะนี้ในที่สุดก็แก้ปัญหาได้: "ถ้า Copy Local ได้ตั้งค่าเป็น True แล้วมีเคล็ดลับในการตั้งค่า Copy Local เป็น false, build จากนั้นตั้ง Copy Local กลับเป็นจริงและ build ฉันไม่รู้ว่าทำไมงานนี้ - DeeArgee 19 พ.ย. 58 เวลา 17:16 น.
เด็บบี้

34

สำหรับฉันทำงานเพิ่มส่วนต่อไปนี้ไปยังweb.configไฟล์:

<configuration>
...
    <runtime>
    ...
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Http.WebHost" publicKeyToken="31bf3856ad364e35" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
        </dependentAssembly>
    ...
    </runtime>
...
</configuration>

ตัวอย่างนี้หมายถึง MVC 5.1 หวังว่ามันจะช่วยให้ใครบางคนในการแก้ไขปัญหาดังกล่าว


2
คุณยอดเยี่ยม ทำงานเหมือนมีเสน่ห์ใน mvc5 ขอบคุณ
David Graça

2
ขอบคุณทำงานกับฉันด้วย +1 คนที่ถามคำถามนี้ควรทำเครื่องหมายว่านี่เป็นคำตอบ!
เรย์

หรือเพียงเพิ่มMicrosoft.AspNet.WebApi.WebHostแพ็คเกจผ่านทาง nuget
Optimax

15

สำหรับฉันมันเริ่มทำงานหลังจากเลือก "ลบไฟล์เพิ่มเติมที่ปลายทาง" ในตัวเลือกการเผยแพร่ไฟล์ภายใต้การตั้งค่าในกล่องโต้ตอบการเผยแพร่


ทำงานให้ฉัน! ทำได้ดีนี่.
ดร. Schizo

นี่เป็นทางออกเดียวที่ได้ผลสำหรับฉัน ฉันเดาว่ามีบางรุ่นเก่าของ dll ที่นั่นสะดุดสิ่งต่าง ๆ ขอบคุณ!
Ohad Schneider

10

dll หายไปในสภาพแวดล้อมที่เผยแพร่แล้ว นั่นคือเหตุผลที่มันทำงานในท้องถิ่นเช่น Visual Studio แต่ไม่ได้อยู่ใน Azure Website Environment

เพียงแค่คัดลอก Local = true ในคุณสมบัติสำหรับแอสเซมบลี (System.Web.Http.WebHost) และจากนั้นทำการ redeploy มันควรจะทำงานได้ดี


กันตรงนี้นี่คือสิ่งที่ต้องการ
pabloelustondo

1
อาจเป็นเพราะวิธีการแก้ปัญหาเดียวกันที่อธิบายไว้ในคำตอบอื่น ๆ อีกหลายปีก่อนหน้านี้
ชาด

6

ฉันใช้ vs2012 และฉันคิดว่าการอัปเดต KB2781514 เปลี่ยนการตั้งค่าบางอย่าง System.Web.Http ทั้งหมดของฉันในโครงการ MVC4 ของฉันเปลี่ยนเป็นเท็จและฉันก็ยังได้รับข้อความนี้อยู่ ฉันเปลี่ยนAll file in this projectคุณสมบัติการประกาศ แต่มันไม่ทำงาน ในที่สุดฉันต้องเปลี่ยนCopy Local = trueทีละคนและแก้ไขปัญหานี้


2

ฉันได้รับข้อผิดพลาดเดียวกันและฉันเปลี่ยนเวอร์ชันจาก 4 เป็น 3 และแก้ไขได้:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <!-- Ensure correct version of MVC -->
    <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
    </dependentAssembly>
</assemblyBinding>

2

ฉันมีปัญหาเดียวกันในแอปพลิเคชันของฉัน

System.web.http.webhost not found.

คุณเพียงแค่ต้องคัดลอกsystem.web.http.webhostไฟล์จากโครงการหลักของคุณที่คุณเรียกใช้ใน Visual Studio และวางลงในbinไดเรกทอรีโครงการของคุณเผยแพร่

หลังจากนี้อาจแสดงข้อผิดพลาดเดียวกัน แต่ชื่อไดเรกทอรีอาจมีการsystem.web.httpเปลี่ยนแปลง ทำตามขั้นตอนเดียวกับข้างต้น มันจะทำงานหลังจากอัพโหลดไฟล์ทั้งหมดแล้ว นี่เป็นเพราะแพ็คเกจ nuget ใน Visual Studio พวกเขาดาวน์โหลดจากอินเทอร์เน็ต แต่บนเซิร์ฟเวอร์มันไม่สามารถดาวน์โหลดได้

คุณสามารถค้นหาไฟล์นี้ได้ในbinไดเรกทอรีโครงการของคุณ


1

สิ่งนี้เกิดขึ้นกับฉันใน VS2013 (อัปเดต 5) /ASP.NET 4.5 ภายใต้ประเภทโครงการ "แอปพลิเคชันเว็บ" ที่มี MVC และ Web API 2 ข้อผิดพลาดเกิดขึ้นทันทีหลังจากสร้างโครงการและก่อนที่จะเพิ่มรหัสใด ๆ การเพิ่มการกำหนดค่าต่อไปนี้แก้ไขได้สำหรับฉัน หลังจากการแก้ไข "System.Web.Helpers" ออกสองข้อผิดพลาดที่คล้ายกันเพิ่มเติมปรากฏขึ้นสำหรับ "System.Web.Mvc" และ "System.Web.WebPages"

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>

0

ฉันหายไปหลาย DLLs แม้ว่าฉันจะคัดลอกมันไปยังไดเรกทอรีด้วยตัวเองในครั้งต่อไปที่ฉันเผยแพร่พวกเขาก็จะหายไป แต่ละรายการถูกตั้งค่าเป็นคัดลอกในเครื่องใน VS แล้ว การแก้ไขสำหรับฉันคือการตั้งค่าแต่ละรายการให้คัดลอกในเครื่องเป็นเท็จบันทึกสร้างจากนั้นตั้งค่าแต่ละรายการให้คัดลอกภายในเครื่องจริง เวลานี้เมื่อฉันเผยแพร่ DLLs ทั้งหมดที่เผยแพร่อย่างถูกต้อง แปลก


0

หากคุณมีหลายโครงการในโซลูชันของคุณและหนึ่งในโครงการของคุณล้มเหลวในการสร้างเนื่องจากข้อผิดพลาดนี้ให้ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งแพคเกจ WebApi Core nuget ในโครงการนั้น เพียงแค่เพิ่มการอ้างอิงถึง System.Web.Http ไม่ได้ช่วยให้คุณต้องติดตั้งแพคเกจ nuget ที่ถูกต้องลงในโครงการนั้น

ฉันมีหลายโครงการในโซลูชันของฉันและ WebApi Core ได้รับการติดตั้งในโครงการอื่นแล้ว ฉันอ้างอิงแอสเซมบลี System.Web.Http โดยการคลิกขวาและทำเครื่องหมายแอสเซมบลีจากรายการและมันไม่ทำงานบน Azure แม้ว่าในเครื่องจะสร้างโอเค ฉันต้องลบการอ้างอิงด้วยตนเองและเพิ่มแพคเกจนักเก็ต WebApi Core ให้กับแต่ละโครงการที่ต้องการการอ้างอิงแอสเซมบลี


0

ในกรณีที่ "Copy Local" เป็น True อยู่แล้วฉันพบว่าบางครั้งมันจะใช้งานได้ถ้าคุณลบไฟล์ที่มันถูกเผยแพร่และเผยแพร่อีกครั้ง

ตัวอย่างเช่นหากคุณใช้ IIS ให้ลบเว็บไซต์และเนื้อหาของไดเรกทอรีที่เผยแพร่และเผยแพร่อีกครั้ง

อาจมีไฟล์เวอร์ชันเก่ากว่าที่ปลายทางดังนั้นเพื่อให้แน่ใจว่าคุณไม่ได้ใช้เวอร์ชันเก่าให้ลบทุกอย่างก่อนเผยแพร่อีกครั้ง


0

ฉันลบรายการต่อไปนี้ออกจาก web.config และทำงานได้สำหรับฉัน

<dependentAssembly>
                <assemblyIdentity name="System.Web.Http.WebHost" culture="neutral" publicKeyToken="31BF3856AD364E35" />
                <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="5.2.6.0" />
            </dependentAssembly>

0

ตรวจสอบให้แน่ใจว่าเวอร์ชันของแพ็กเกจมีค่าเท่ากันในโซลูชัน ฉันเพิ่งดาวน์เกรด & อัปเกรดMicrosoft.AspNet.Mvcแพ็กเกจข้ามโซลูชันและแก้ไขปัญหาแล้ว

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