URL Rewrite работает для всех моих URL, кроме одного - PullRequest
0 голосов
/ 05 ноября 2019

Мой ARR URL Rewrite работает для всех простых URL: s

/api/Login, /api/BusinessPartners

, но не для этого:

/api/sml.svc/LIF_cv_ServiceCallsParameters(FromDate='2019-11-04',ToDate='2019-11-11',CardCode='EMPTY',CallType=0,ProbType=0,ProbSubType=0,Status=0,Owner=0,Tech=0,LineStat='ASFC')/LIF_cv_ServiceCalls

Я получаю 404, не найден

Я разработал приложение Angular 8, размещенное в службе приложений Azure. Серверная часть находится в другом месте и не поддерживает CORS, поэтому необходим обратный прокси-сервер. Я следовал за частями http://ruslany.net/2014/05/using-azure-web-site-as-a-reverse-proxy/. Plus Руслана, многих других постов, связанных с обратным прокси ARR.

Вот мой applicationHost.xdt, расположенный в каталоге / site.

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <system.webServer>
        <proxy xdt:Transform="InsertIfMissing" enabled="true" preserveHostHeader="false" 
            reverseRewriteHostInResponseHeaders="false">
        </proxy>
        <rewrite>
            <allowedServerVariables>
                <add name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" xdt:Transform="InsertIfMissing" />
                <add name="HTTP_ACCEPT_ENCODING" xdt:Transform="Insert" />
                <add name="HTTP_X_ORIGINAL_HOST" xdt:Transform="InsertIfMissing" />
            </allowedServerVariables>
        </rewrite>
    </system.webServer>
</configuration>

Правила в web.config:

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Angular Routes" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_URI}" pattern="^/(api)" negate="true"/>
          </conditions>
          <action type="Rewrite" url="/index.html" />
        </rule>
        <rule name="proxy" stopProcessing="true">
          <match url="api/(.*)" />
          <action type="Rewrite" url="http://XX.XX.XX.XX:50001/b1s/v1/{R:1}"/>
          <serverVariables>
            <!--set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" /-->
            <set name="HTTP_ACCEPT_ENCODING" value="" />
          </serverVariables>
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Части FailedRequestLog:

76. URL_CHANGED
OldUrl="/api/sml.svc/LIF_cv_ServiceCallsParameters(FromDate='2019-01-01',ToDate='2050-01-01',CardCode='EMPTY',CallType=0,ProbType=0,ProbSubType=0,Status=0,Owner=0,Tech=0,LineStat='U')/LIF_cv_ServiceCalls",
NewUrl="http://XX.XX.XX.XX:50001/b1s/v1/sml.svc/LIF_cv_ServiceCallsParameters(FromDate='2019-01-01',ToDate='2050-01-01',CardCode='EMPTY',CallType=0,ProbType=0,ProbSubType=0,Status=0,Owner=0,Tech=0,LineStat='U')/LIF_cv_ServiceCalls"

87. AspNetStart Data1="GET", Data2="/api/sml.svc", Data3=""

Точный вызов в NewUrl работает в PostMan.

Кажется, чтоПравило перезаписи правильно обрабатывает URL, но вызов не выполняется бэкэнду (проверено с помощью wireshark на удаленном компьютере). Вместо этого AspNetStart пытается прочитать файл или папку api / sml.svc, что в итоге приводит к коду 404.

Любые предложения о том, как заставить это работать, очень приветствуются!

...