Noções básicas sobre Serviços de Aplicativos de perfil e autenticação do AJAX ASP.NET

por Scott Cate

O serviço de Autenticação permite que os usuários forneçam credenciais para receber um cookie de autenticação e é o serviço de gateway para permitir perfis de usuário personalizados fornecidos por ASP.NET. O uso do serviço de autenticação ASP.NET AJAX é compatível com a autenticação padrão do ASP.NET Forms, portanto, os aplicativos que atualmente usam a autenticação de Formulários (como com o controle logon) não serão interrompidos atualizando para o serviço de autenticação AJAX.

Introdução

Como parte do .NET Framework 3.5, a Microsoft está fornecendo uma atualização de ambiente considerável; não apenas um novo ambiente de desenvolvimento está disponível, mas os novos recursos de CONSULTA Language-Integrated (LINQ) e outros aprimoramentos de linguagem estão próximos. Além disso, alguns recursos familiares de outros conjuntos de ferramentas, notadamente as extensões ASP.NET AJAX, estão sendo incluídos como membros de primeira classe da biblioteca de classes base .NET Framework. Essas extensões permitem muitos novos recursos avançados do cliente, incluindo a renderização parcial de páginas sem a necessidade de uma atualização de página inteira, a capacidade de acessar os Serviços Web por meio do script do cliente (incluindo a API de criação de perfil de ASP.NET) e uma extensa API do lado do cliente projetada para espelho muitos dos esquemas de controle vistos no conjunto de controle do lado do servidor ASP.NET.

Este white paper analisa a implementação e o uso dos serviços de Criação de Perfil e Autenticação de Formulários ASP.NET, pois eles são expostos pelas Extensões do Microsoft ASP.NET AJAXAs Extensões do AJAX facilitam o suporte à autenticação de Formulários, pois ela (bem como o Serviço de Criação de Perfil) é exposta por meio de um script de proxy do Serviço Web. As Extensões AJAX também dão suporte à autenticação personalizada por meio da classe AuthenticationServiceManager.

Esse white paper é baseado na versão Beta 2 do Visual Studio 2008 e no .NET Framework 3.5. Esse white paper também pressupõe que você trabalhará com o Visual Studio 2008 Beta 2, não o Visual Web Developer Express, e fornecerá instruções passo a passo de acordo com a interface do usuário do Visual Studio. Alguns exemplos de código podem utilizar modelos de projeto indisponíveis no Visual Web Developer Express.

Perfis e autenticação

Os serviços de Autenticação e Perfis de ASP.NET da Microsoft são fornecidos pelo sistema ASP.NET Forms Authentication e são componentes padrão de ASP.NET. As extensões ASP.NET AJAX fornecem acesso de script a esses serviços por meio de proxies de script, por meio de um modelo bastante simples no namespace Sys.Services da biblioteca AJAX do cliente.

O serviço de Autenticação permite que os usuários forneçam credenciais para receber um cookie de autenticação e é o serviço de gateway para permitir perfis de usuário personalizados fornecidos por ASP.NET. O uso do serviço de autenticação ASP.NET AJAX é compatível com a autenticação padrão do ASP.NET Forms, portanto, os aplicativos que atualmente usam a autenticação de Formulários (como com o controle logon) não serão interrompidos atualizando para o serviço de autenticação AJAX.

O serviço Perfil permite a integração automática e o armazenamento de dados do usuário com base na associação, conforme fornecido pelo serviço de Autenticação. Os dados armazenados são especificados pelo arquivo web.config e os vários provedores de serviço de criação de perfil lidam com o gerenciamento de dados. Assim como acontece com o serviço de Autenticação, o serviço de Perfil AJAX é compatível com o serviço de perfil de ASP.NET padrão, de modo que as páginas que incorporam atualmente recursos do serviço ASP.NET Profile não devem ser interrompidas, incluindo o suporte a AJAX.

Incorporar os próprios serviços de Autenticação e Criação de Perfil ASP.NET em um aplicativo está fora do escopo desse white paper. Para obter mais informações sobre o tópico, consulte o artigo de referência Biblioteca MSDN Gerenciando usuários usando a associação em https://msdn.microsoft.com/library/tw292whz.aspx. ASP.NET também inclui um utilitário para configurar automaticamente a Associação com um SQL Server, que é o provedor de serviços de autenticação padrão para associação ASP.NET. Para obter mais informações, consulte o artigo ASP.NET SQL Server Ferramenta de Registro (Aspnet_regsql.exe) em https://msdn.microsoft.com/library/ms229862(vs.80).aspx.

Usando o serviço de autenticação AJAX ASP.NET

O ASP.NET serviço de Autenticação AJAX deve ser habilitado no arquivo web.config:

<system.web.extensions> 
 <scripting>
 <webServices>
 <authenticationService enabled="true" /> 
 </webServices>
 </scripting> 
</system.web.extensions>

O serviço de Autenticação exige que a autenticação do ASP.NET Forms seja habilitada e exige que os cookies sejam habilitados no navegador do cliente (um script não pode habilitar uma sessão sem cookie, pois as sessões sem cookie exigem parâmetros de URL).

Depois que o serviço de autenticação AJAX estiver habilitado e configurado, o script do cliente poderá aproveitar imediatamente o objeto Sys.Services.AuthenticationService. Principalmente, o script do cliente desejará aproveitar o método e isLoggedIn a login propriedade. Existem várias propriedades para fornecer padrões para o método de logon, que pode aceitar um grande número de parâmetros.

Membros Sys.Services.AuthenticationService

método de logon:

O método login() inicia uma solicitação para autenticar as credenciais do usuário. Esse método é assíncrono e não bloqueia a execução.

Parâmetros:

Nome do parâmetro Significado
userName Obrigatórios. O nome de usuário a ser autenticado.
password Opcional (o padrão é nulo). A senha do usuário.
Ispersistent Opcional (o padrão é false). Se o cookie de autenticação do usuário deve persistir entre as sessões. Se for falso, o usuário fará logoff quando o navegador for fechado ou a sessão expirar.
Redirecturl Opcional (o padrão é nulo). A URL para a qual redirecionar o navegador após a autenticação bem-sucedida. Se esse parâmetro for nulo ou uma cadeia de caracteres vazia, nenhum redirecionamento ocorrerá.
customInfo Opcional (o padrão é nulo). Atualmente, esse parâmetro não é usado e é reservado para uso futuro.
loginCompletedCallback Opcional (o padrão é nulo). A função a ser chamada quando o logon for concluído com êxito. Se especificado, esse parâmetro substituirá a propriedade defaultLoginCompleted.
failedCallback Opcional (o padrão é nulo). A função a ser chamada quando o logon falhar. Se especificado, esse parâmetro substituirá a propriedade defaultFailedCallback.
Usercontext Opcional (o padrão é nulo). Dados de contexto de usuário personalizados que devem ser passados para as funções de retorno de chamada.

Valor retornado:

Essa função não inclui um valor retornado. No entanto, vários comportamentos são incluídos após a conclusão de uma chamada para essa função:

  • A página atual será atualizada ou alterada se o redirectUrl parâmetro não for nulo nem uma cadeia de caracteres vazia.
  • No entanto, se o parâmetro for nulo ou uma cadeia de caracteres vazia, o loginCompletedCallback parâmetro ou defaultLoginCompletedCallback a propriedade será chamado.
  • Se a chamada para o serviço Web falhar, o failedCallback parâmetro da defaultFailedCallback propriedade será chamado.

método logout:

O método logout() remove o cookie de credenciais e faz logoff do usuário atual do aplicativo Web.

Parâmetros:

Nome do parâmetro Significado
Redirecturl Opcional (o padrão é nulo). A URL para a qual redirecionar o navegador após a autenticação bem-sucedida. Se esse parâmetro for nulo ou uma cadeia de caracteres vazia, nenhum redirecionamento ocorrerá.
logoutCompletedCallback Opcional (o padrão é nulo). A função a ser chamada quando o logoff tiver sido concluído com êxito. Se especificado, esse parâmetro substituirá a propriedade defaultLogoutCompleted.
failedCallback Opcional (o padrão é nulo). A função a ser chamada quando o logon falhar. Se especificado, esse parâmetro substituirá a propriedade defaultFailedCallback.
Usercontext Opcional (o padrão é nulo). Dados de contexto de usuário personalizados que devem ser passados para as funções de retorno de chamada.

Valor retornado:

Essa função não inclui um valor retornado. No entanto, vários comportamentos são incluídos após a conclusão de uma chamada para essa função:

  • A página atual será atualizada ou alterada se o redirectUrl parâmetro não for nulo nem uma cadeia de caracteres vazia.
  • No entanto, se o parâmetro for nulo ou uma cadeia de caracteres vazia, o logoutCompletedCallback parâmetro ou defaultLogoutCompletedCallback a propriedade será chamado.
  • Se a chamada para o serviço Web falhar, o failedCallback parâmetro da defaultFailedCallback propriedade será chamado.

propriedade defaultFailedCallback (get, set):

Essa propriedade especifica uma função que deve ser chamada se ocorrer uma falha na comunicação com o serviço Web. Ele deve receber um delegado (ou referência de função).

A referência de função especificada por essa propriedade deve ter a seguinte assinatura:

function AuthenticationFailureCallback(error, userContext, methodName);

Parâmetros:

Nome do parâmetro Significado
erro Especifica as informações de erro.
Usercontext Especifica as informações de contexto do usuário fornecidas quando a função de logoff ou logoff foi chamada.
Methodname O nome do método de chamada.

propriedade defaultLoginCompletedCallback (get, set):

Essa propriedade especifica uma função que deve ser chamada quando a chamada do serviço Web de logon for concluída. Ele deve receber um delegado (ou referência de função).

A referência de função especificada por essa propriedade deve ter a seguinte assinatura:

function AuthenticationLoginCompletedCallback(validCredentials, userContext, methodName);

Parâmetros:

Nome do parâmetro Significado
validCredentials Especifica se o usuário forneceu credenciais válidas. true se o usuário fez logon com êxito; caso contrário false, .
Usercontext Especifica as informações de contexto do usuário fornecidas quando a função de logon foi chamada.
Methodname O nome do método de chamada.

propriedade defaultLogoutCompletedCallback (get, set):

Essa propriedade especifica uma função que deve ser chamada quando a chamada do serviço Web de logoff for concluída. Ele deve receber um delegado (ou referência de função).

A referência de função especificada por essa propriedade deve ter a seguinte assinatura:

function AuthenticationLogoutCompletedCallback(result, userContext, methodName);

Parâmetros:

Nome do parâmetro Significado
result Esse parâmetro sempre será null; ele é reservado para uso futuro.
Usercontext Especifica as informações de contexto do usuário fornecidas quando a função de logon foi chamada.
Methodname O nome do método de chamada.

propriedade isLoggedIn (get):

Essa propriedade obtém o estado de autenticação atual do usuário; ele é definido pelo objeto ScriptManager durante uma solicitação de página.

Essa propriedade retornará true se o usuário estiver conectado no momento; caso contrário, retornará false.

propriedade path (get, set):

Essa propriedade determina programaticamente o local do serviço Web de autenticação. Ele pode ser usado para substituir o provedor de autenticação padrão, bem como um conjunto declarativamente na propriedade Path do nó filho AuthenticationService do controle ScriptManager (para obter mais informações, consulte o tópico Usando um Provedor de Serviços de Autenticação Personalizada abaixo).

Observe que o local do serviço de autenticação padrão não é alterado. No entanto, ASP.NET AJAX permite que você especifique o local de um serviço Web que fornece a mesma interface de classe que o proxy do serviço de autenticação AJAX ASP.NET.

Observe também que essa propriedade não deve ser definida como um valor que direciona a solicitação de script para fora do site atual. Como o aplicativo atual não receberia as credenciais de autenticação, ele seria inútil; além disso, o AJAX subjacente à tecnologia não deve postar solicitações entre sites e pode gerar uma exceção de segurança no navegador do cliente.

Essa propriedade é um String objeto que representa o caminho para o serviço Web de autenticação.

propriedade timeout (get, set):

Essa propriedade determina o período de tempo para aguardar o serviço de autenticação antes de assumir que a solicitação de logon falhou. Se o tempo limite expirar enquanto aguarda a conclusão de uma chamada, o retorno de chamada com falha na solicitação será chamado e a chamada não será concluída.

Essa propriedade é um Number objeto que representa o número de milissegundos para aguardar os resultados do serviço de autenticação.

Exemplo de código: fazer logon no Serviço de Autenticação

A marcação a seguir é um exemplo ASP.NET página com uma chamada de script simples para os métodos de logoff e logoff da classe AuthenticationService.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head runat="server">
 <title>Login Example</title>
 <script type="text/javascript">
 function Login()
 {
 var userTextbox = $get("txtUser");
 var passTextbox = $get("txtPassword");
 Sys.Services.AuthenticationService.login(userTextbox.value, 
 passTextbox.value, false, null, null, LoginServiceCompleted, 
 LoginServiceFailed, "Context Info");
 }
 function Logout()
 {
 Sys.Services.AuthenticationService.logout(null, LogoutServiceCompleted, 
 LoginServiceFailed, "Context Info");
 }
 function LoginServiceFailed(error, userContext, methodName)
 {
 alert('There was an error with the authentication service:\n\n' + error);
 }
 function LoginServiceCompleted(validCredentials, userContext, methodName)
 {
 if (validCredentials)
 {
 alert('Great! You successfully logged in.');
 }
 else
 {
 alert('Oops! You gave us bad credentials!');
 }
 }
 function LogoutServiceCompleted(result, userContext, methodName)
 {
 alert('You have been logged out from the web site.');
 }
 </script>
 </head>
 <body>
 <form id="form1" runat="server">
 <asp:ScriptManager ID="ScriptManager1" runat="server" 
 EnableScriptLocalization="true">
 </asp:ScriptManager>
 <div>
 <asp:TextBox ID="txtUser" runat="Server"></asp:TextBox>
 <br />
 <asp:TextBox ID="txtPassword" runat="Server" TextMode="Password"/>
 <br />
 <asp:Button Text="Log in" ID="btnLogin" runat="server" 
 OnClientClick="Login(); return false;" />
 </div>
 </form>
 </body>
</html>

Acessando ASP.NET dados de criação de perfil por meio do AJAX

O serviço de criação de perfil ASP.NET também é exposto por meio das extensões AJAX ASP.NET. Como o ASP.NET serviço de criação de perfil fornece uma API avançada e granular pela qual armazenar e recuperar dados do usuário, essa pode ser uma excelente ferramenta de produtividade.

O serviço de perfil deve ser habilitado no web.config; não é por padrão. Para fazer isso, verifique se o profileService elemento filho habilitou= true especificado em web.config e se você especificou quais propriedades podem ser lidas ou gravadas da seguinte maneira:

<system.web.extensions>
 <scripting>
 <webServices>
 <profileService enabled="true"
 readAccessProperties= Name,Address,BackgroundColor 
 writeAccessProperties= BackgroundColor />
 </webServices>
 </scripting>
</system.web.extensions>

O serviço de perfil também deve ser configurado. Embora a configuração do serviço de criação de perfil esteja fora do escopo desse white paper, vale a pena observar que os grupos, conforme definido nas configurações de perfil, estarão acessíveis como subpropriedades do nome do grupo. Por exemplo, com a seguinte seção de perfil especificada:

<profile enabled="true">
 <properties>
 <add name="Name" type="System.String"/>
 <group name="Address">
 <add name="Line1" type="System.String"/>
 <add name="Line2" type="System.String"/>
 <add name="City" type="System.String"/>
 <add name="State" type="System.String"/>
 <add name="Zip" type="System.String"/>
 </group>
 <add name="BackgroundColor" type="System.Drawing.Color"/>
 </properties>
</profile>

O script do cliente seria capaz de acessar Name, Address.Line1, Address.Line2, Address.City, Address.State, Address.Zip e BackgroundColor como propriedades do campo propriedades da classe ProfileService.

Depois que o Serviço de Criação de Perfil do AJAX estiver configurado, ele estará disponível imediatamente nas páginas; no entanto, ele terá que ser carregado uma vez antes do uso.

Membros do Sys.Services.ProfileService

campo properties:

O campo propriedades expõe todos os dados de perfil configurados como propriedades filho que podem ser referenciadas pela convenção dot-operator-name. As propriedades que são filhos de grupos de propriedades são conhecidas como GroupName.PropertyName. Na configuração de perfil de exemplo apresentada acima, para obter o estado do usuário, você pode usar o seguinte identificador:

Sys.Services.ProfileService.properties.Address.State

método load:

Carrega uma lista selecionada ou todas as propriedades do servidor.

Parâmetros:

Nome do parâmetro Significado
Propertynames Opcional (o padrão é nulo). As propriedades a serem carregadas do servidor.
loadCompletedCallback Opcional (o padrão é nulo). A função a ser chamada ao carregar foi concluída.
failedCallback Opcional (o padrão é nulo). A função a ser chamada se ocorrer um erro.
Usercontext Opcional (o padrão é nulo). Informações de contexto a serem passadas para a função de retorno de chamada.

A função de carga não tem um valor retornado. Se a chamada for concluída com êxito, ela chamará o loadCompletedCallback parâmetro ou defaultLoadCompletedCallback a propriedade . Se a chamada falhou ou o tempo limite expirou, o failedCallback parâmetro ou defaultFailedCallback a propriedade será chamado.

Se o propertyNames parâmetro não for fornecido, todas as propriedades configuradas por leitura serão recuperadas do servidor.

método save:

O método save() salva a lista de propriedades especificada (ou todas as propriedades) no perfil ASP.NET do usuário.

Parâmetros:

Nome do parâmetro Significado
Propertynames Opcional (o padrão é nulo). As propriedades a serem salvas no servidor.
saveCompletedCallback Opcional (o padrão é nulo). A função a ser chamada ao salvar foi concluída.
failedCallback Opcional (o padrão é nulo). A função a ser chamada se ocorrer um erro.
Usercontext Opcional (o padrão é nulo). Informações de contexto a serem passadas para a função de retorno de chamada.

A função save não tem um valor retornado. Se a chamada for concluída com êxito, ela chamará o saveCompletedCallback parâmetro ou defaultSaveCompletedCallback a propriedade . Se a chamada falhou ou o tempo limite expirou, a failedCallback propriedade ou defaultFailedCallback será chamada.

Se o propertyNames parâmetro for nulo, todas as propriedades de perfil serão enviadas para o servidor e o servidor decidirá quais propriedades podem ser salvas e quais não podem.

propriedade defaultFailedCallback (get, set):

Essa propriedade especifica uma função que deve ser chamada se ocorrer uma falha na comunicação com o serviço Web. Ele deve receber um delegado (ou referência de função).

A referência de função especificada por essa propriedade deve ter a seguinte assinatura:

function AuthenticationFailureCallback(error, userContext, methodName);

Parâmetros:

Nome do parâmetro Significado
Erro Especifica as informações de erro.
Usercontext Especifica as informações de contexto do usuário fornecidas quando a função de carregamento ou salvamento foi chamada.
Methodname O nome do método de chamada.

propriedade defaultSaveCompleted (get, set):

Essa propriedade especifica uma função que deve ser chamada após a conclusão de salvar os dados de perfil do usuário. Ele deve receber um delegado (ou referência de função).

A referência de função especificada por essa propriedade deve ter a seguinte assinatura:

function ProfileSaveComplete(numPropsSaved, userContext, methodName);

Parâmetros:

Nome do parâmetro Significado
numPropsSaved Especifica o número de propriedades que foram salvas.
Usercontext Especifica as informações de contexto do usuário fornecidas quando a função de carregamento ou salvamento foi chamada.
Methodname O nome do método de chamada.

propriedade defaultLoadCompleted (get, set):

Essa propriedade especifica uma função que deve ser chamada após a conclusão do carregamento dos dados de perfil do usuário. Ele deve receber um delegado (ou referência de função).

A referência de função especificada por essa propriedade deve ter a seguinte assinatura:

function ProfileLoadComplete(numPropsLoaded, userContext, methodName);

Parâmetros:

Nome do parâmetro Significado
numPropsLoaded Especifica o número de propriedades carregadas.
Usercontext Especifica as informações de contexto do usuário fornecidas quando a função de carregamento ou salvamento foi chamada.
Methodname O nome do método de chamada.

propriedade path (get, set):

Essa propriedade determina programaticamente o local do serviço Web de perfil. Ele pode ser usado para substituir o provedor de serviços de perfil padrão, bem como um conjunto declarativamente na propriedade Path do nó filho ProfileService do controle ScriptManager.

Observe que o local do serviço de perfil padrão não é alterado. No entanto, ASP.NET AJAX permite que você especifique o local de um serviço Web que fornece a mesma interface de classe que o proxy do serviço de autenticação AJAX ASP.NET.

Observe também que essa propriedade não deve ser definida como um valor que direciona a solicitação de script para fora do site atual. O AJAX subjacente à tecnologia não deve postar solicitações entre sites e pode gerar uma exceção de segurança no navegador do cliente.

Essa propriedade é um String objeto que representa o caminho para o serviço Web de perfil.

propriedade timeout (get, set):

Essa propriedade determina o período de tempo para aguardar o serviço de perfil antes de assumir que a solicitação de carregamento ou salvamento falhou. Se o tempo limite expirar enquanto aguarda a conclusão de uma chamada, o retorno de chamada com falha na solicitação será chamado e a chamada não será concluída.

Essa propriedade é um Number objeto que representa o número de milissegundos a aguardar os resultados do serviço de perfil.

Exemplo de código: carregando dados de perfil no carregamento da página

O código a seguir marcar para ver se um usuário está autenticado e, nesse caso, carregará a cor de tela de fundo preferida do usuário como a da página.

function Page_Load()
{
 if (Sys.Services.AuthenticationService.get_isLoggedIn())
 {
 Sys.Services.ProfileService.load();
 }
}
function ProfileLoaded(numPropsLoaded, userContext, methodName)
{
 document.documentElement.style.backgroundColor = Sys.Services.ProfileService.properties.BackgroundColor;
}

Usando um provedor de serviços de autenticação personalizada

As extensões ASP.NET AJAX permitem que você crie um provedor de serviços de autenticação de script personalizado expondo sua funcionalidade por meio de um serviço Web personalizado. Para ser usado, seu serviço Web deve expor dois métodos Login e Logout; e esses métodos devem ser especificados com as mesmas assinaturas de método que o padrão ASP.NET serviço Web de Autenticação AJAX.

Depois de criar o serviço Web personalizado, você precisará especificar o caminho para ele, seja declarativamente em sua página, programaticamente no código ou por meio do script do cliente.

Para definir o caminho declarativamente:

Para definir o caminho declarativamente, inclua o filho AuthenticationService do objeto ScriptManager na página ASP.NET:

<asp:ScriptManager ID="ScriptManager1" runat="server">
 <AuthenticationService Path="~/AuthService.asmx" />
</asp:ScriptManager>

Para definir o caminho no código:

Para definir o caminho programaticamente, especifique o caminho por meio da instância do gerenciador de scripts:

protected void Page_Load(object sender, EventArgs e)
{
    this.ScriptManager1.AuthenticationService.Path = "~/AuthService.asmx";
}

Para definir o caminho no script:

Para definir o caminho programaticamente no script, utilize a path propriedade da classe AuthenticationService:

function Login()
{
 var userTextbox = $get("txtUser");
 var passTextbox = $get("txtPassword");
 Sys.Services.AuthenticationService.set_path("./AuthService.asmx");
 Sys.Services.AuthenticationService.login(userTextbox.value, passTextbox.value, false, null, null, LoginServiceCompleted, LoginServiceFailed, "Context Info");
}

Serviço Web de exemplo para autenticação personalizada

<%@ WebService Language="C#" Class="AuthService" %>
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;
[ScriptService]
[WebService]
public class AuthService : WebService
{
 [WebMethod]
 public bool Login(string userName, string password, bool createCookie)
 {
 Session["LoggedInUser"] = userName;
 return true;
 }
 [WebMethod]
 public void Logout()
 {
 Session.Abandon();
 }
}

Resumo

ASP.NET serviços – especificamente os serviços de criação de perfil, associação e autenticação – são facilmente expostos ao JavaScript no navegador do cliente. Isso permite que os desenvolvedores integrem seu código do lado do cliente ao mecanismo de autenticação perfeitamente, sem depender de controles como UpdatePanels para fazer o trabalho pesado. Os dados de perfil também podem ser protegidos do cliente, utilizando as configurações da Web; nenhum dado está disponível por padrão e os desenvolvedores devem aceitar as propriedades do perfil.

Além disso, ao criar implementações simplificadas de serviço Web com assinaturas de método equivalentes, os desenvolvedores podem criar provedores de script personalizados para esses serviços de ASP.NET intrínsecos. O suporte para essas técnicas simplifica o desenvolvimento de aplicativos cliente avançados, ao mesmo tempo em que fornece aos desenvolvedores uma ampla gama de flexibilidade para atender a necessidades específicas.

Biografia

Scott Cate trabalha com tecnologias da Microsoft Web desde 1997 e é presidente de myKB.com (www.myKB.com), onde é especialista em escrever aplicativos baseados em ASP.NET focados em soluções de Software de Base de Conhecimento. Scott pode ser contatado por e-mail em scott.cate@myKB.com ou seu blog em ScottCate.com