System.Web.Services 4.0.0.0 – błąd ładowania w .NET Framework i .NET Core, diagnostyka, bindingRedirect

Pytanie

One or more errors occurred. (Could not load file or assembly 'System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Nie można odnaleźć określonego pliku.)

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Aplikacja nie znajduje biblioteki System.Web.Services (4.0.0.0), bo
    a) uruchamiasz ją poza .NET Framework (np. w .NET Core / .NET 5‑8) lub
    b) biblioteka nie jest dostępna w GAC / katalogu bin, albo wersja się nie zgadza.
  • Rozwiązanie: upewnij się, że projekt rzeczywiście wymaga .NET Framework i ma poprawną referencję, ewentualnie zmigruj kod do nowszych alternatyw (HttpClient, WCF Connected Services, CoreWCF) lub doinstaluj/nareperuj .NET Framework 4.x i dodaj bindingRedirect.

Szczegółowa analiza problemu

  1. Geneza błędu
    • System.Web.Services.dll jest częścią .NET Framework (≥ 4.0) i nigdy nie została przeniesiona do .NET (Core)/.NET 5+.
    • Podczas ładowania CLR szuka biblioteki w katalogu aplikacji, następnie w GAC. Jeżeli żądanego zestawu nie ma lub wersja jest niewłaściwa – wyrzuca FileLoadException.
  2. Typowe scenariusze:
    a) Projekt przeniesiony do .NET 6+ (SDK‑style) zawiera stary kod SOAP → runtime nie znajdzie biblioteki.
    b) Masz projekt .NET Framework, ale na serwerze nie ma Frameworka 4.x (lub instalacja jest uszkodzona).
    c) W rozwiązaniu występuje konflikt wersji (bindingRedirect wymuszający 4.0.0.0, a w bin leży 2.0.0.0).
  3. Ścieżka diagnostyczna
    • Sprawdź właściwość Target Framework w pliku .csproj/.vbproj (powinno być net48, a nie net6.0).
    • Fusion Log Viewer (fuslogvw.exe) pokaże dokładnie, gdzie CLR szukał DLL‑ki.
    • W GAC (C:\Windows\Microsoft.NET\assembly\GACMSIL\System.Web.Services\4.0.0.0…​) potwierdź obecność biblioteki; w razie braku – napraw/instaluj Framework.
    • W Visual Studio → References → System.Web.Services → Copy Local = True, jeśli aplikacja powinna wozić DLL „własnoręcznie” (np. click‑once).
  4. Kiedy nie da się załadować (projekty .NET Core/5‑8)
    • System.Web.Services.dll wprawdzie można dodać jako reference assembly, ale przy uruchomieniu zostanie odrzucona (platform not supported).
    • Rozwiązania migracyjne:
    – do prostych wywołań HTTP(S): HttpClient, System.Text.Json/Newtonsoft.Json.
    – klient SOAP: dotnet-svcutil, SoapCore, CoreWCF (open‑source fork WCF).
    – dla serwerowej strony SOAP: host starych usług w procesie IIS na .NET Framework, a aplikację właściwą utrzymywać w .NET 6+.

Aktualne informacje i trendy

  • Microsoft od .NET 5+ oficjalnie oznaczył wszystkie przestrzenie nazw System.Web.* jako legacy; rekomenduje migrację do REST lub CoreWCF (GA 2023‑12).
  • .NET 8 (listopad 2023) wprowadza AOT i trimming – biblioteki Frameworkowe mogą być obcinane; manualne dopisanie System.Web.Services nie zadziała.
  • NuGet System.Web.Services nie jest utrzymywany; w Community Toolkit pojawiły się translatory SOAP→REST, jednak nadal dominuje migracja do HTTP/JSON.

Wspierające wyjaśnienia i detale

  • BindingRedirect:
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Services"
                        publicKeyToken="b03f5f7f11d50a3a"
                        culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.0.0.0"
                       newVersion="4.0.0.0"/>
    </dependentAssembly>
    </assemblyBinding>
  • Reinstalacja Frameworka: ndp48-web.exe (lub dotnet-framework-repair-tool.exe) przywraca pliki w GAC i re‑rejestruje manifesty.
  • gacutil /l System.Web.Services — szybkie sprawdzenie obecności w GAC.

Aspekty etyczne i prawne

  • SOAP nadal bywa wymagany w e‑administracji (np. JPK VAT w PL); wymusza utrzymywanie starych bibliotek.
  • Utrzymanie projektu na nieobsługiwanej wersji Frameworka może rodzić ryzyko bezpieczeństwa (EOL dla .NET 4.5/4.6).
  • Licencjonowanie: .NET Framework jest darmowy, ale redistribucja własna DLL z niezgodną wersją może łamać postanowienia EULA (nie modyfikować plików Microsoft).

Praktyczne wskazówki

  1. Jeśli projekt ma zostać na .NET Framework:
    • Zainstaluj/napraw .NET 4.8 na serwerze.
    • W VS: dodaj referencję, CopyLocal = True, oczyść/rebuild.
  2. Jeśli chcesz być cross‑platform:
    • Usuń odwołania do System.Web.Services.
    • Wygeneruj klienta SOAP:
     dotnet tool install --global dotnet-svcutil
     dotnet-svcutil https://adresSerwisu?wsdl

    • Zastąp klasę SoapHttpClientProtocol własnym wrapperem na HttpClient.

  3. Deployment CI/CD: w pipeline dodaj krok nuget restore i msbuild /p:CopyLocalLockFileAssemblies=true, aby DLL‑ki trafiały do paczki.

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • Kopiowanie System.Web.Services.dll ręcznie do katalogu bin może zamaskować głębszy problem (niewłaściwy target framework).
  • Trimming/AOT w .NET 8 może usunąć nawet własnoręcznie dołączoną DLL; dodaj w .csproj:
    <TrimmerRootDescriptor Include="System.Web.Services" />

    – ale to tylko dla analiz; nie działa runtime.

Sugestie dalszych badań

  • Ocena kosztu migracji SOAP→REST vs utrzymanie .NET Framework (TCO).
  • CoreWCF 1.5 – produkcyjna gotowość, kompatybilność z dokumentacją WCF.
  • Monitorowanie roadmapy .NET 9 (zapowiedzi Microsoft Build 2024) – planowane narzędzia ułatwiające porting SOAP.
  • Publikacje:
    • Microsoft “Porting third‑party .NET Framework libraries to .NET 7” (2023)
    • eBook “Modernizing ASP.NET Apps to Azure” (2024 ed.).

Krótkie podsumowanie

Błąd wynika z braku lub nieobsługiwalności System.Web.Services.dll.
1) Jeśli używasz .NET Framework – dodaj referencję, napraw instalację, ewentualnie bindingRedirect.
2) Jeśli projekt jest .NET Core/5‑8 – biblioteka nie zadziała; przejdź na alternatywy (HttpClient, CoreWCF, dotnet‑svcutil).
Zanim skopiujesz DLL ręcznie, sprawdź target framework i GAC, a diagnostykę rozpocznij od fuslogvw.exe.

Oceń odpowiedź:
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.