Кажется, что Silverlight WCF Self Hosting не находит ClientAccessPolicy.xml - PullRequest
1 голос
/ 10 мая 2011

Я создал службу хостинга WCF на локальной машине, и приложение Silverlight получает данные из этой службы и отправляет их на удаленный сервер.Это работало более месяца, но внезапно перестало жаловаться на общеизвестные ошибки. Clientaccesspolicy.xml не удалось устранить.Потратив довольно много времени на отладку, я понял, что это не удалось, поскольку адрес удаленного сервера был изменен на IP-адрес вместо адресов домена, например http://2xx.1xx.223 iso http://www.myserver.com,, но адрес домена больше не доступенпоэтому я не могу воспроизвести его и не уверен, что изменение адреса действительно является преступлением.

Это все равно работает нормально, если веб-сервер и служба собственного хостинга работают на моем компьютере разработчика, и я вижу файл в своем браузере как "http://localhost:8000/clientaccesspolicy.xml", но ошибка 404, если ввести "http://my -machine-name: 8000 / clientaccesspolicy.xml". Как я читал в некоторых блогах, файл clientaccesspolicy.xml должен находиться в 80 портах локальной машины, но я не знаю, как это сделать.и не уверен, что это создает проблему.

Мой сервисный хост настроен следующим образом:

          string baseAddress = "http://localhost:8000";
         //Create a ServiceHost for the OPCService type and 
         //provide the base address.
        _serviceHost = new ServiceHost(typeof(OpcService), new Uri(baseAddress));
        _serviceHost.AddServiceEndpoint(typeof(IOpcService), new BasicHttpBinding(), new Uri(baseAddress + "/OpcService"));
        _serviceHost.AddServiceEndpoint(typeof(IPolicyRetriever), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());

И clientacceccpolicy.xml используется через интерфейс

       private Stream StringToStream(string result)
    {
        WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
        return new MemoryStream(Encoding.UTF8.GetBytes(result));
    }

    public Stream GetSilverlightPolicy()
    {
        string result = @"<?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>";
        return StringToStream(result);
    }

И silverlightклиент использует службу с прокси-сервером без ServiceReferences.ClientConfig, но с привязкой службы, чтобы легко получить веб-методы.

       public class ServiceProxy
{
    private const string ServiceEndPoint = "http://localhost:8000/OpcService";
    private static Uri _serviceMap = new Uri(ServiceEndPoint, UriKind.Absolute);

    public static T GetProxyFor<T>()
    {
        return new ChannelFactory<T>(new BasicHttpBinding(), new EndpointAddress(_serviceMap)).CreateChannel();
    }

    [Export]
    public IOpcService SyrOpcService
    {
        get { return GetProxyFor<IOpcService>(); }
    }

    public static SYR.HMI.OpcProxy.ServiceReference.OpcServiceClient GetProxy()
    {
        return new SYR.HMI.OpcProxy.ServiceReference.OpcServiceClient();
    }
}

Я считаю,Здесь много тем и гугл, но не совсем как у меня, и до сих пор неясно, в чём проблема, смена IP-адреса или расположение файла клиента.

Буду признателен за добрый совет.Заранее спасибо.

HK.Lee

1 Ответ

1 голос
/ 11 мая 2011

Я сделал небольшое тестовое приложение SL с двумя небольшими методами и изменил адрес конечной точки ClientConfig в http://ipv4.fiddler:8000 вместо http://locahost:8000.

Fiddler выглядит как clientaccesspolicy.xml из 127.0.0.1 iso localhost, поэтому я изменил свой прокси-адрес SL-клиента на 127.0.0.1 вместо localhost. Все отлично работает.

Забавно, почему localhost не работает, если xap загружается с IP-адреса vc domain name? Я не знаю деталей, но кто-нибудь даст какой-нибудь совет.

HK.lee

...