У меня есть устаревший веб-сайт asp.net и новый основной сайт asp.net, использующий cookie-файл авторизации.Когда я пытаюсь сделать HTTP-запрос CORS от Typescript
(на основном сайте) к методу веб-службы (на устаревшем сайте), используя Axios
, он завершается с ошибкой , если я не передаю пустой объект данных.Например:
Этот запрос будет терпеть неудачу :
const url: string = "http://legacy.mydev.machine:1259/MyService.asmx/GetInformation";
const optionsThatWontWork: AxiosRequestConfig = {
withCredentials: true
};
axios.get(url, optionsThatWontWork)
.then((response) => { console.log(response); })
.catch((error) => { console.log(error); });
Браузер выполняет 1 запрос HTTP GET (без предварительной проверки), который возвращает HTTP 500 со следующимсообщение в ответе
"Формат запроса не распознан для URL, неожиданно заканчивающегося на '/GetInformation'."
Но этот работает :
const url: string = "http://legacy.mydev.machine:1259/MyService.asmx/GetInformation";
const optionsThatWillWork: AxiosRequestConfig = {
withCredentials: true,
data: {
// Adding this empty data object makes a difference
}
};
axios.get(url, optionsThatWillWork)
.then((response) => { console.log(response); })
.catch((error) => { console.log(error); });
В этом случае браузер делает 2 запроса.Первый - это запрос HTTP OPTIONS, который возвращает 200, затем второй - GET, который успешно достигает конечной точки GetInformation
и возвращает 200 с данными json.
При сравнении двух сообщений HTTP GET единственноеРазница, которую я вижу, состоит в том, что успешный имеет заголовок Content-Type: application/json;charset=utf-8
.
Я попытался добавить этот заголовок вручную, но это тоже не сработало:
const optionsThatStillWontWork: AxiosRequestConfig = {
withCredentials: true,
headers: {
"Content-Type": "application/json;charset=utf-8"
},
};
Я настроилCORS в конвейере Owin
старого сайта с использованием Microsoft.Owin.Cors
:
Private Sub ConfigureCors(ByVal app As IAppBuilder)
Dim corsPolicy = New CorsPolicy() With {
.AllowAnyMethod = True,
.AllowAnyHeader = True,
.SupportsCredentials = True,
.AllowAnyOrigin = False
}
corsPolicy.Origins.Add("http://newsite.mydev.machine:9050")
Dim corsPolicyProvider = New CorsPolicyProvider With {
.PolicyResolver = Function(context) Task.FromResult(corsPolicy)
}
Dim options = New CorsOptions With {
.PolicyProvider = corsPolicyProvider
}
app.UseCors(options)
End Sub
Примечание: и http://legacy.mydev.machine:1259
, и http://newsite.mydev.machine:1259
имеют записи в моем файле hosts, указывающие на 127.0.0.1
.
Согласно документации axios опция конфигурации data
равна
"Применимо только для методов запроса PUT, POST иPATCH '"
... с чем я бы согласился.
Тогда пара вопросов:
- Почему происходит добавление пустого объекта
data
заставить это работать? - Почему первый пример не выполняет предполёт?
- Мой CНастройки ORS на старом сайте выглядят нормально?