C# týden November Black Friday
BlackFriday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Pouze tento týden sleva až 80 % na e-learning týkající se C#
Avatar
skilledt
Člen
Avatar
skilledt:14. června 10:33

Zdravím, narazil jsem na zádrhel při získávání dat z webové služby pomocí ajax requestu. V rámci mé webové aplikace(psané v php, konrétně v codeigniteru + jquery), potřebuji získávat data z Asp net web service. Vše jsem nastavil a vyzkoušel lokálně a následně i na našem testovacím serveru. Tam jsem již narazil na problém s CORS, který se ale podařil vyřešit pouhým přidáním následujícího kódu do sekce custom headers, poté vše fungovalo.

<add name="Access-Control-Allow-Headers" value="accept, content-type" />
      <add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" />

Při instalaci u klienta jsem však na problém opět narazil a nedaří se mi ho vyřešit. Konrétně prohlížeč při pokusu o získání dat zahlásí tyto chyby:

OPTIONS http://10.208.1.27/planws/Service.asmx 405 (Method Not Allowed)
Access to XMLHttpRequest at 'http://10.208.1.27/planws/Service.asmx' from origin 'http://localhost' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

Na tomto serveru jede IIS ve verzi 6, a přesto že jsem nastavil následující custom headers, nedaří se mi této chyby zbavit.

Access-Control-Allow-Headers: accept, content-type
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Origin: *

Má někdo zkušenosti s podobným problémem, případně nápad jak toto vyřešit? Váhal jsem jestli to patří spíš sem nebo do sekce javascriptu, ale zdá se že todle se spíš musí řešit na straně serveru, proto jsem to nakonec hodil do této sekce.

 
Odpovědět
14. června 10:33
Avatar
skilledt
Člen
Avatar
Odpovídá na skilledt
skilledt:14. června 10:43

Ještě dodám, že v případě že si otevřu tu kýženou webovou aplikaci v chromu s --disable-web-security parametrem, tak request proběhne bez problémů.

 
Nahoru Odpovědět
14. června 10:43
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:14. června 10:49

Dobry browser se brani CORSem. Cili, spravne ti to fungovat nesmi.

Nove vymysleli, ze kdyz kdyz tam pridas hash, tak by to mohlo stahnout.
https://developer.mozilla.org/…ce_Integrity

<script src="https://example.com/example-framework.js"
        integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
        crossorigin="anonymous"></script>

Jinak to samozrejme muzes obejit stazenim stranky do asp a vypsanim uzivateli. V php by to bylo

<?php $url='...'; echo file_get_contents($url); ?>

Timto zpusobem je ta stranka povazovana za tvou. Ale pak nemusi spravne fungovat linky a pod.

 
Nahoru Odpovědět
14. června 10:49
Avatar
zelvicek
Člen
Avatar
Odpovídá na skilledt
zelvicek:14. června 11:51

Jak sleduji tebou založená témata, získávám dojem, že ses pustil do projektu, který je nad tvé síly. Především ve znalosti vývoje webových aplikací a také schopnosti hledat na netu. Zajímalo by mě, v které oblasti IT jsi skilled. Myslím, že bys měl najít někoho, kdo ti s vývojem tvé aplikace pomůže - ta investice by se určitě vyplatila.

Tipuju, že sis při sepisování smlouvy ani nezjistil, v jakém prostředí (a za jakých podmínek) má být aplikace provozována. Nenapadá mě, jak jinak ses dostal do stavu, kdy jsi "najednou" v den nasazení zjistil, že IIS bude verze 6. Těch překvapení může být v blízké budoucnosti více.

Ale k tématu. Chci věřit, že sis odchytil síťovou komunikaci mezi klientem a serverem, z čehož jsi pochopil, kde ta chybová hláška vzniká. Ta chybová hláška je celkem jasná 405-Method Not Allowed.
Doporučuji si nastudovat konfiguraci IIS6. Nebo alespoň hledat na internetu.

 
Nahoru Odpovědět
14. června 11:51
Avatar
skilledt
Člen
Avatar
Odpovídá na zelvicek
skilledt:14. června 12:09

Nezjistil jsem to samozřejmě najednou, tento problém už řeším nějaký čas, jsem spíše frontenďák , backend na mě bohužel padl také, takže je fakt, že v IIS, kord v IIS6 nejsem tolik zběhlý.

Samozřejmě že jsem prohledal kde co, ale nic co by problém vyřešilo jsem nenašel - zkoušel jsem nastavit headery u odpovědi natvrdo, stejně tak u přípony asmx v nastavení povolit metodu OPTIONS vše bez úspěchu. Jinak je většina řešení pro verzi IIS7. Proto jsem se zkusil zeptat tady, jestli poradíš budu rád, ale jinak se mi zdá reakce ve stylu "je to jasný najdi si to" poměrně zbytečná a arogantní.

 
Nahoru Odpovědět
14. června 12:09
Avatar
zelvicek
Člen
Avatar
Odpovídá na skilledt
zelvicek:14. června 12:29

Ano, můj příspěvek je trochu arogantní. Považuji ovžem za aroganci z tvé strany fakt, že jsi nepopsal tebou vyzkoušené kroky již při zadání tématu. Z informací dodaných v předchozím příspěvku je patrné, které kroky jsi učinil, ostatní o nich již nemusí uvažovat a rovnou je vyloučit.

Musím připustit, že neznám další kroky, které by problém vyřešily a bez přístupu k danému IIS nejsem schopen více poradit.

 
Nahoru Odpovědět
14. června 12:29
Avatar
zelvicek
Člen
Avatar
Odpovídá na skilledt
zelvicek:14. června 12:54

Ještě jedna věc. Nepíšeš, že jsi zkontroloval logy IIS - jsi si jistý, že ty OPTIONS requesty na něj dorazí? Nebylo by poprvé, kdy má zákazník prudce inteligentní proxy, která něco odfiltruje.

 
Nahoru Odpovědět
14. června 12:54
Avatar
skilledt
Člen
Avatar
Odpovídá na zelvicek
skilledt:14. června 13:19

V pohodě, je fakt, že jsem to uvést mohl, tak snad aspoň takhle jsem to dodatečně doplnil. Díky za tip, do logů jsem mrknul a OPTIONS request dorazí, dál už nic.

 
Nahoru Odpovědět
14. června 13:19
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na skilledt
don.jarducius:16. června 14:59

Ahoj, v tom případě ale prohlížeči nedorazí správná odpověď... Zkontroluj si konzoli a síť v prohlížeči co dostaneš od serveru. Případně pak zkus na IIS volat jinou stránku (ne asmx) jestli ti dorazí cors hlavičky v odpovědi.

Nahoru Odpovědět
16. června 14:59
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Odpovídá na skilledt
don.jarducius:16. června 15:04

Ještě se ve webconfigu podívej, jestli máš povolené httpoption v protokolech... Aby server věděl, že na to má vůbec nějak reagovat.

Nahoru Odpovědět
16. června 15:04
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
skilledt
Člen
Avatar
skilledt:17. června 10:27

Děkuji za tipy, zkusím to omrknout. Nevím kterou část webconfigu v IIS 6 konkrétně myslíš, můj webconfig vypadá následovně:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
        <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
        <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
          <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>
          <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
          <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
          <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
        </sectionGroup>
      </sectionGroup>
    </sectionGroup>
  </configSections>
  <appSettings>
    <add key="Conn1" value="Transport=TCP;Port=16000;Server=10.208.1.27;Database=DataDemo;Compression=9;BlockReadSize=512000;UserName=;PassWord=;"/>

  </appSettings>
  <connectionStrings/>
  <system.web>
    <!--
            Set compilation debug="true" to insert debugging
            symbols into the compiled page. Because this
            affects performance, set this value to true only
            during development.
        -->
    <compilation debug="true">
      <assemblies>
        <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
    </compilation>
    <!--
            The <authentication> section enables configuration
            of the security authentication mode used by
            ASP.NET to identify an incoming user.
        -->
    <authentication mode="Windows"/>
    <!--
            The <customErrors> section enables configuration
            of what to do if/when an unhandled error occurs
            during the execution of a request. Specifically,
            it enables developers to configure html error pages
            to be displayed in place of a error stack trace.

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        -->
    <pages>
      <controls>
        <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      </controls>
    </pages>
    <httpHandlers>
      <remove verb="*" path="*.asmx"/>
      <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </httpHandlers>
    <httpModules>
      <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </httpModules>
  </system.web>
  <!--
        The system.webServer section is required for running ASP.NET AJAX under Internet
        Information Services 7.0.  It is not necessary for previous version of IIS.
    -->
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Headers" value="accept, content-type"/>
        <add name="Access-Control-Allow-Origin" value="*"/>
        <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS"/>
      </customHeaders>
    </httpProtocol>
      <validation validateIntegratedModeConfiguration="false"/>
    <modules>
      <remove name="ScriptModule"/>
      <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </modules>
    <handlers>
      <remove name="WebServiceHandlerFactory-Integrated"/>
      <remove name="ScriptHandlerFactory"/>
      <remove name="ScriptHandlerFactoryAppServices"/>
      <remove name="ScriptResource"/>
      <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add name="ScriptResource" verb="GET,HEAD" path="ScriptResource.axd" preCondition="integratedMode" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </handlers>
  </system.webServer>
  <system.codedom>
      <compilers>
        <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
          <providerOption name="CompilerVersion" value="v3.5"/>
          <providerOption name="WarnAsError" value="false"/>
      </compiler>
    </compilers>
  </system.codedom>
  <runtime>
    <assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Je tam i ta pasáž system.webserver, která ale pro IIS6 zřejmě nemá význam

 
Nahoru Odpovědět
17. června 10:27
Avatar
skilledt
Člen
Avatar
skilledt:17. června 11:05

Jinak co se týče té odpovědi na OPTIONS request, tak v chromu mi to ukázalo, že response má v hlavičce pouze toto:

Access-Control-Allow-Headers: x-requested-with, cache-control, content-type, origin
Access-Control-Allow-Methods: GET,POST,DELETE,OPTIONS
Access-Control-Allow-Origin: *

Takže vlastně jenom to, co jsem natvrdo nastavil v IIS.

 
Nahoru Odpovědět
17. června 11:05
Avatar
Odpovídá na skilledt
don.jarducius:17. června 11:54

Zkus do webconfigu přidat do sekce system.web

<webServices>
 <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
    <add name="AnyHttpSoap"/>
  </protocols>
</webServices>
Nahoru Odpovědět
17. června 11:54
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
skilledt
Člen
Avatar
skilledt:17. června 12:09

Zkusil jsem a bohužel nic se nezměnilo. Přemýšlím jestli zakopaný pes nebude v těch handlerech.

 
Nahoru Odpovědět
17. června 12:09
Avatar
Odpovídá na skilledt
don.jarducius:18. června 8:28

Ještě mě teď napadlo, zkusil jsi vyvolat funkce pomocí prohlížeče nad vygenerovaným html k asmx? … když zadáš url služby do prohlížeče?

Nahoru Odpovědět
18. června 8:28
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.