Междоменные сообщения в приложение ASP.Net MVC
Я занимаюсь разработкой приложения, в котором фрагменты HTML и javascript доставляются различным клиентам. Я могу получить фрагменты html/javascript, добавив следующее в файл веб-конфигурации:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" />
</customHeaders>
</httpProtocol>
Это отлично работает для получения GETS. Проблема, с которой я сталкиваюсь, состоит в том, чтобы сделать кросс-домены POST с помощью jQuery:
$.ajax(
{
type: 'POST',
url: url,
crossDomain: true,
data: JSON.stringify(data),
dataType: 'json',
contentType: 'application/json',
success: function(responseData, textStatus, jqXHR)
{
alert('Success');
},
error: function (responseData, textStatus, errorThrown)
{
alert('POST failed.');
}
});
У меня будет множество клиентов, потребляющих мое приложение (надеюсь). Я думал об использовании прокси, но у меня нет контроля над клиентскими серверами, поэтому я не могу установить httpHandler для работы в качестве прокси.
Любые предложения о том, как я могу POST JSON-данные из разных клиентов кросс-домен в мое приложение ASP.Net MVC?
5 ответов
Я возился со своим вызовом ajax, и он, кажется, работает (сравните с вызовом ajax выше):
$.ajax(
{
type: 'POST',
url: url,
crossDomain: true,
data: data,
dataType: 'json',
success: function(responseData, textStatus, jqXHR)
{
alert('success');
},
error: function (responseData, textStatus, errorThrown)
{
alert('POST failed.');
}
});
Я удалил вызовы "contentType: 'application/json'" и "JSON.stringify(...)" и могу отправлять сообщения на сервер.
Я не уверен, как объяснить, почему это работает. Есть идеи? Есть ли проблемы с безопасностью? Я делаю все это на своем ноутбуке. Я установил 2 разных сайта через IIS 7. Будет ли это иметь значение?
Внутренне ответ JSONP (тип по умолчанию для междоменных запросов) выбирается путем внедрения <script>
тег, который указывает на URL. Из-за этого только GET
Метод возможен с JSONP. Другие методы будут игнорироваться и возвращаться к GET
,
Когда вы указали для свойства crossDomain значение "true", свойство dataType будет установлено как jsonp. Однако вам понадобится способ обработать этот jsonp на стороне MVC. Возможно, вы захотите взглянуть на следующую запись stackru: ASP.net MVC возвращает JSONP
Если у вас есть контроль над тем, какие JS-библиотеки вы включаете, лучше всего использовать одну из многих междоменных библиотек. Клиент (приложение MVC в вашем случае) должен будет настроить его на прием таких запросов, в большинстве случаев это означает, что на принимающей стороне должна быть одна и та же библиотека.
Лучший из найденных мной - это EasyXDM. Не много ограничений и приспосабливается к возможностям браузера. Но вы должны иметь его в обоих приложениях, которые общаются друг с другом.
У вас есть два варианта, в dataType вы можете поместить текст или JSONP вместо JSON. и если вы дадите нам пример данных, которые вы отправляете, это будет проще.
С уважением