У меня есть приложение Web Api, распространяемое на других серверах.
Моя ситуация такова:
---------------------
- LOAD BALANCER -
---------------------
----------- ------------- ------------- --------------
SERVER 1 SERVER 2 SERVER 3 SERVER 4
----------- ------------- ------------- --------------
У меня есть список серверов ip. Выполняется основной вызов:
http://webapidefault/mywebapi/v01/method
Этот URL-адрес делает балансировку нагрузки выбором сервера на том, что запрос должен быть выполнен. Я бы хотел выполнить эту операцию на всех серверах.
Я думаю, чтобы использовать IP-адреса серверов для составления запроса POST, и когда главный вызов получен одним из серверов, сам сервер вызывает остальных:
http://serverIP/mywebapi/v01/method
Когда я запускаю запрос, он возвращает ошибку 401 unauthorize.
Как я могу решить ситуацию?
Код, который я запускаю, следующий:
[Route("methodtoperformonallservers")]
[HttpPost]
public ResponseMessageResult PerformAllServers()
{
var result = MyHelper.PerformAll();
if(result != -1)
{
return WebHelper.CreateResponseMessageResult(HttpStatusCode.OK, result);
}
else
{
return WebHelper.CreateResponseMessageResult(HttpStatusCode.InternalServerError, result);
}
}
Мой помощник выполнит:
public static int PerformAll()
{
foreach( var serverIP in serverList)
{
var reqStr = http://serverIP/mywebapi/v01/methodtoperformonspecificserver;
var reqUri = new Uri(reqStr);
var myrequest = (HttpWebRequest)WebRequest.Create(reqUri);
myrequest.Method = "POST";
myrequest.ContentLenght = 0;
var response = (HttpWebResponse)request.GetResponse();
.
.
.
.
}
}
Когда вызов GetResponse называется, он выдает исключение 401.
Как я могу решить свою ситуацию? Заранее спасибо.
С наилучшими пожеланиями
Мне непонятно, почему вы хотите/должны выполнить этот метод на всех 4 серверах. Балансировщик нагрузки обычно полезен, когда вы хотите распространять нагрузку на несколько серверов и не выполнять процесс на всех серверах.
Если это для каких-то работ по обслуживанию, я бы предложил реализовать логику в клиенте, а не в вашем API.
Во всяком случае, я не думаю, что ошибка, которую вы получаете (http-ошибка 401), не имеет никакого отношения к выполнению вашего метода. Это связано с тем, что ваш запрос не аутентифицирован, и API ожидает некоторые учетные данные.
Как ваш API защищен? Он когда-либо работал на одном из этих 4 серверов?
С помощью дополнения Firefox Headertool
вы можете добавить строку Authorize
в заголовках HTTP, чтобы исправить ошибку неавторизованного доступа.
С помощью Fiddler вы можете отслеживать и отлаживать сообщения HTTP.