Silverlight crossdomain
-
19-08-2019 - |
Pergunta
Eu vi um monte de links para MSDN e "funciona na minha máquina!" responde assim que eu gostaria de perguntar a minha pergunta com as etapas exatas para duplicar o que estou fazendo. Como estamos usando um webservice já existente, eu estou perguntando com o contexto de ter um webservice hospedado fora do meu projeto, ao contrário de muitos dos tutoriais e vídeos online. Então aqui vai:
*** Criar um novo projeto webservice ASP.NET.
Ela virá com um arquivo Service.asmx existente expondo um método web "HelloWorld".
Exibir no navegador, clique no botão "Chamar". Ele deve funcionar retornando a string "Olá Mundo".
Na minha máquina, o URL é: " http: // localhost: 15511 / WebSite5 / Service.asmx "
*** Iniciar uma nova instância do Visual Studio, crie um projeto de aplicativo Silverlight Web.
*** vara um único botão no lá com um manipulador de eventos para chamar o serviço web. Eu, pessoalmente, armas nucleares da grade e usar um simples StackPanel. por exemplo.
<UserControl x:Class="SilverlightApplication1.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<StackPanel>
<Button Click="Button_Click">
<Button.Content>
<TextBlock Text="Test"/>
</Button.Content>
</Button>
</StackPanel>
</UserControl>
Adicionar a referência da web, utilizando a instrução e manipulador de eventos para o Button_Click:
private void Button_Click(object sender, RoutedEventArgs e)
{
ServiceSoapClient client = new ServiceSoapClient();
client.HelloWorldCompleted += (object s, HelloWorldCompletedEventArgs ea) => {
MessageBox.Show(ea.Result);
};
client.HelloWorldAsync();
}
- Execute o aplicativo do Silverlight. No meu caso eu estou indo para o meu Silverlight Página de teste em: http: // localhost: 15558 / SilverlightApplication1TestPage.aspx
Executar e, claro, ele explode por causa de problemas crossdomain. Assim, na próxima adicionar o clientaccesspolicy arquivo com o seguinte para a raiz do seu aplicativo web que hospeda o serviço:
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource include-subpaths="true" path="/"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
Isso deve abrir as coisas, uma vez que tem um curinga para cabeçalhos, uris e recursos, certo?
- Executar novamente e você receber um erro:
Ocorreu um erro ao tentar fazer uma solicitação para URI ' http: // localhost: 15511 / WebSite5 / Service.asmx '. Isto pode ser devido ao tentar acessar um serviço de forma cross-domain sem uma política de domínio cruzado adequada no local, ou uma política que não é adequado para serviços SOAP. Você pode precisar entrar em contato com o proprietário do serviço para publicar um arquivo de diretivas de domínio e para garantir que ele permite relacionados SOAP-cabeçalhos HTTP a ser enviada.
questão Então: existe um segredo para o arquivo clientaccesspolicy? Pode-se alternadamente tentar com o crossdomain.xml mas dá um resultado semelhante.
Solução
Eu tive esse mesmo problema um par de vezes. No passado já resolvi isso usando a Web App como o arranque, mas parece que você já tenha feito isso.
O meu post sobre o assunto: http://www.donnfelker.com/ silverlight-cross-domain-emissão /
Outras dicas
Eu encontrei este problema (SL v5.0 e Visual Studio 2010), que fixa-lo para mim é que eu fui para as propriedades do projeto Silverlight >> guia Silverlight e selecionou "Exigir confiança elevada quando rodando no navegador"
Certifique-se de que você colocar o arquivo clientaccesspolicy na raiz do diretório web IIS por exemplo.
C: \ Inetpub \ wwwroot \ clientaccesspolicy
Isso fará com que ele seja acessível diretamente em http: ///clientaccesspolicy.xml
Eu estava recebendo o mesmo erro e eu resolvê-lo fazer o acima etapas.
Cliente de Configuração
Talvez seu ServiceReferences.ClientConfig
para o seu cliente Silverlight está apontando para o URL errado?
Além disso, verifique a localização do seu arquivo de política de domínio cruzado. Este MSDN artigo tem mais informações.
Localmente Correndo Silverlight
Nota adicional para a execução de Silverlight localmente (Vista Sidebar, por exemplo). Conforme relatado no esta entrada do blog , "Silverlight não pode usar qualquer provedor de rede, quando rodando localmente. " a solução é usar javascript para interface para o serviço web nesta situação.
Algo que funcionou para mim começou com o que encontrei nos fóruns Silverlight aqui . Ele perguntou essencialmente se eu poderia até mesmo get ao meu clientaccesspolicy ou crossdomain.xml de localhost (http: //localhost/clientaccesspolicy.xml). Quando eu tentei navegar até lá, eu não poderia então eu simplesmente encontrei o código para ambos (também dentro do segmento acima mencionado) e copie-colado sobre o interior de código dos arquivos existentes na minha inetpub \ wwwroot \ diretório (I abriu-los usando o Notepad ++). A parte estranha foi o código não muda em nada , e, no entanto, ele funciona! Espero que ajude alguém! Este foi extremamente estranho.
clientaccesspolicy
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
crossdomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
Seja abençoado!
-sF
Você já tentou violinista ao usar este através do IE, você pode ser capaz de ver o tráfego Silverlight é causando, como quais arquivos de políticas transversais que está procurando?
Eu modifiquei as minhas configurações do Internet Explorer. O site é executado em um servidor web estagiário então eu adicionei-o na lista Sites Iexplorer confiável. (Ferramentas-> Opções da Internet-> Security-> Sites).
Então eu mudei o nível de segurança e permitiu domínios transversais. Feito, Works, mas me levou tempo para encontrar a solução.
Best, Jeppen
Você tem que estar ciente de situação que quando você faz referência ao seu serviço dentro de seu projeto não vai ser criado arquivo 'Reference.ClienConfig' e existe:
**
<endpoint address="http://localhost:57675/Servis.asmx" binding="basicHttpBinding"
bindingConfiguration="ServisSoap" contract="ServiceReference1.ServisSoap"
name="ServisSoap" />
**
Certifique-se de que a página ainda está usando a mesma porta (por exemplo, aqui é 57675). Por padrão, o localhost obterá porta aleatória, então você tem que mudá-lo para ser o número estático e não dinâmico. (Clique direito do mouse em projeto asp.net / Tab Web / porta específica número / tipo Espero que ajude
Eu corri para algo como isso e adicionando um ServiceHostFactory fixa o meu problema. O arquivo de política entre domínios por si só não corrigi-lo.
class MyHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
MyHost customServiceHost =
new MyHost(serviceType, new Uri("[Your URL goes here]",UriKind.Absolute));
return customServiceHost;
}
}
class MyHost : ServiceHost
{
public MyHost(Type serviceType, params Uri[] baseAddresses) base(serviceType, baseAddresses)
{ }
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
}
}
Você também tem que adicionar fábrica = "MyHostFactory" na tag que define o seu serviço
O problema pode ser que seu servidor de desenvolvimento não é capaz de servir o arquivo xml, tente este - explicitamente torná-lo disponível através WebGet
[ServiceContract]
public interface ICrossDomainService
{
[OperationContract]
[WebGet(UriTemplate = "ClientAccessPolicy.xml")]
Message ProvidePolicyFile();
}
e, em seguida, o ProvidePolicyFile () pode ser
public System.ServiceModel.Channels.Message ProvidePolicyFile()
{
FileStream filestream = File.Open(@"ClientAcessPolicy.xml", FileMode.Open);
// Either specify ClientAcessPolicy.xml file path properly
// or put that in \Bin folder of the console application
XmlReader reader = XmlReader.Create(filestream);
System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
return result;
}
Ele trabalhou no meu pc com sucesso, você pode colocar a sua
clientaccesspolicy
<?xml version="1.0" encoding="utf-8"?> <access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
tanto o diretório do projeto e seus webservices raiz.
Eu estava enfrentando o mesmo problema e tomar mais de 3 dias para descobrir o problema. Percebo também quando eu estava chamando a internet Service Cloud WCF de um aplicativo Silverlight hospedado em outro servidor web isso só mostra erros Cross-Domain. Depois de olhar para alguns lugares que eu não resolver o problema, mesmo colocando cross-domain.xml e clientaccesspolice.xml arquivos no diretório raiz do serviço. Então, eu apenas tento em vez de usar http://example.com Eu apenas alterá-lo para garantir https://example.com e muito bem trabalhado. Os erros de domínio cruzado desaparece. serviço foi chamado sem problemas.
Verifique qual projeto é conjunto padrão. Ele deve ser o projeto web que devem ser conjunto padrão e não o projeto Silverlight.