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();
    }

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.

Foi útil?

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.

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