Pergunta

Tenho lutado para que minha chamada jquery para um método da web funcione.Estou sendo devolvido pelo servidor com uma resposta "401 Não Autorizado".Devo ter uma configuração incorreta no web.config ou em outro lugar que impediria uma chamada bem-sucedida.

Sua visão é apreciada!

Chame a função js e invoca a chamada jquery

button.OnClickAction = "PageMethod('TestWithParams', ['a', 'value', 'b', 2], 'AjaxSucceeded', 'AjaxFailed'); return false;";

Função JavaScript que faz a chamada do jquery

function PageMethod(fn, paramArray, successFn, errorFn) {
var pagePath = window.location.pathname;
var urlPath = pagePath + "/" + fn;

//Create list of parameters in the form:  
//{"paramName1":"paramValue1","paramName2":"paramValue2"}  
var paramList = '';
if (paramArray.length > 0) {
    for (var i = 0; i < paramArray.length; i += 2) {
        if (paramList.length > 0) paramList += ',';
        paramList += '"' + paramArray[i] + '":"' + paramArray[i + 1] + '"';
    }
}
paramList = '{' + paramList + '}';

//Call the page method
$.ajax({
    type: "POST",
    url: pagePath + "/" + fn,
    contentType: "application/json; charset=utf-8",
    data: paramList,
    timeout: 10000,
    dataType: "json",
    success: function(result) { alert('Overjoyed'); },
    error: function(result) { alert('No joy'); }
});
}

Método web na página

    public partial class WebLayout : System.Web.UI.Page
{

    [WebMethod()]
    public static int TestNoParams()
    {
        return 1;
    }

    [WebMethod()]
    public static string TestWithParams(string a, int b)
    {
        return a + b.ToString();
    }
...

Resposta conforme vista no console do Firebug

json: {"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}

e

"NetworkError: 401 Unauthorized - http://localhost/Care-Provider-Home/Profile/Personal-Profile.aspx/TestWithParams" TestWithParams

Consultei e li os sites habituais sobre o assunto (Encosia, et al), mas aproveitei.Ou estou faltando uma peça crítica ou há algumas sutilezas nos parâmetros de segurança do meu ambiente que impedem uma chamada.

Aqui estão algumas outras informações potencialmente úteis que podem afetar seu diagnóstico:

  • Métodos Web em codebehind
  • Usando Sitecore CMS (não parece interferir, nunca se sabe)
  • IIS7
  • .NET 3.5
  • jQuery 1.3.2

Aguardo seus insights e orientações - obrigado!

Foi útil?

Solução

Sim, funcionou!Como o Sitecore CMS realiza a reescrita de URLs para gerar URLs amigáveis ​​(ele monta as páginas em camadas, dinamicamente, semelhante ao conceito de Master Page), me ocorreu que isso pode estar causando algum problema que causou inicialmente o erro 401.Verifiquei isso criando um projeto separado com um único ASPX - e com algum trabalho consegui chamar os métodos da web e obter valores usando o jquery.Em seguida, criei ASPX quase idêntico em minha raiz da web, mas disse ao Sitecore para ignorá-lo quando uma solicitação fosse feita (IgnoreUrlPrefixes no web.config), depois de algum trabalho também consegui fazê-lo funcionar com sucesso!Obrigado pela ajuda.

Outras dicas

A resposta JSON do console do Firebug fornece a pista mais reveladora da IMO. O System.InValidoPerationException (que estranhamente monta em uma resposta 401) sugere que algo mais está em ação.

Primeiro, pesquisar no Google no "INVALIDOPERATIONEXCECTION WebMethod JQuery", retorna artigos que sugerem que problemas de serialização podem lançar essa exceção. Para descartar isso, altere temporariamente "dados: paramlist" para "dados: '{}'". Além disso, anexe um depurador e veja se a exceção acontece antes que o método seja executado ou depois de concluir e tenta serializar o resultado.

Se as etapas acima ficarem vazias, você pode tentar redefinir para um web.config limpo ou ler mais dos resultados que voltar

Que forma de autenticação você está usando, se houver?A primeira coisa que vem à mente é certificar-se de que seu webApp no ​​IIS esteja configurado para permitir usuários anônimos (se você realmente deseja fazer a chamada como usuário anônimo).Além disso, o seu modo de autenticação em web.config não está definido para Windows por engano.Se você não puder permitir usuários anônimos e estiver usando autenticação de formulários, o usuário deverá estar logado antes que esta chamada seja feita em sua página.

Se os itens acima estiverem configurados corretamente, tente fazer uma chamada regular para o serviço do lado do servidor para garantir que o problema seja consistente, independentemente do ponto de invocação do serviço.

Poste mais configurações se o problema não for resolvido.Espero que isto ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top