Я искал проблему и решил сделать возможно самое простое воспроизведение проблемы в надежде, что упрощенный вопрос поможет мне решить эту проблему.
Я получаю 401 при публикации в веб-службе через ajax в javascript. Я включу как можно больше информации, а также все шаги по устранению неполадок, которые я пробовал.
Я создал тестовую страницу в корне моего сайта и попробовал как обычный JS, так и jquery для вызова ajax с теми же результатами. Я включил jquery, закомментированный...
Страница
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//" "http://www.w3.org/TR/html4/loose.dtd">
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript">
/*$(document).ready(function() {
$('#button').click(function() {
var ID = 2;
var firstname = $('#First_Name').val();
var lastname = $('#Last_Name').val();
$.ajax({
type: 'POST',
url: '/service/name/service.aspx/ChangeName',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
data: '{ "ID": "' + ID + '", "firstName": "' + firstname + '", "lastName": "' + lastname + '" }',
success: function() {
console.log('success');
},
error: function(d) {
console.log(d.responseText);
}
});
});
});*/
function runAjax() {
//Create Http request depending on browser
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;}
}
// Function to create
var url = "/service/name/service.aspx/ChangeName";
xmlhttp.open("POST",url,true);
xmlhttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");
var data=JSON.stringify({ "ID": "2", "firstName": "John", "lastName": "Doe" });
xmlhttp.send(data);
}
</script>
</head>
<body>
<div id="myDiv">
<table width="100%" cellpadding="3" cellspacing="0">
<tbody>
<tr>
<td width="34%">
<div align="right">
<strong>First Name: </strong>
</div>
</td>
<td>
<div>
<input name="First_Name" type="text"id="First_Name" size="20">
</div>
</td>
</tr>
<tr>
<td>
<div align="right">
<strong>Last Name: </strong>
</div>
</td>
<td>
<input name="Last_Name" type="text" id="Last_Name" size="20">
</td>
</tr>
</tbody>
</table>
<div align="center">
<input id="button" type="button" value="Update Student Details" onclick="runAjax();" style="margin:5px;">
</div>
</div>
</body>
</html>
Теперь во всех браузерах, кроме IE10, это работает нормально. В скрипаче это показывает, что IE получает ответ 401
Заголовки запроса скрипач
POST http://dev.mysite/service/name/service.aspx/ChangeName HTTP/1.1
Accept: */*
Content-Type: application/json; charset=utf-8
Referer: http://dev.mysite/test_page.html
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
Connection: Keep-Alive
Content-Length: 46
DNT: 1
Host: dev.mysite
Pragma: no-cache
{"ID":"2","firstName":"John","lastName":"Doe"}
Заголовки ответов скрипач
HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.0
jsonerror: true
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Thu, 07 Mar 2013 01:12:05 GMT
Content-Length: 105
Proxy-Support: Session-Based-Authentication
Я включил отслеживание неудачных запросов на сервере, и это информация, которую он дает мне для этого вызова:
Журнал неудачных запросов iis
<сильный>1. -GENERAL_REQUEST_START
- Идентификатор сайта – 2
- AppPoolId — ASP.NET v4.0
- КоннИд – 1610622306
- RawConnId – 0
- URL-адрес запроса — http://dev.mysite:80/service/name/service.aspx/ChangeName
- RequestVerb – POST
<сильный>2. -FILTER_START
- Имя фильтра — C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_filter.dll
<сильный>3. -FILTER_END
<сильный>4. -AspNetStart
- Идентификатор соединения – 0
- Идентификатор контекста – {00000000-0000-0000-6425-0080000000BF}
- Данные1 – POST
- Данные2 — /service/name/service.aspx
- Данные3 –
<сильный>5. -GENERAL_REQUEST_END
- Отправлено байтов – 359
- Получено байтов – 440
- Статус HTTP – 401.
- HttpSubStatus – 0
Вещи, которые я обнаружил, упростив запрос ajax, заключались в том, что это не только проблема Windows 8, и включение режима совместимости также не работает.
Я попытался отключить аутентификацию в режиме ядра в IIS, я трижды проверил разрешения для папки веб-службы, следовал этим советам, я даже пытался разместить веб-службу в том же каталоге, что и страница. Все с тем же результатом... Мы очень признательны за любое направление или помощь.