Silverlight для самостоятельного размещения WCF

У меня есть приложение Silverlight, в котором есть WCF. Поскольку это собственный WCF, я понимаю, что мне нужно добавить интерфейс примерно так:

[ServiceContract]
public interface IPolicyRetriever
{
    [OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
    Stream GetSilverlightPolicy();
    [OperationContract, WebGet(UriTemplate = "/crossdomain.xml")]
    Stream GetFlashPolicy();
}

и реализация:

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);
    }
    public Stream GetFlashPolicy()
    {
        string result = @"<?xml version=""1.0""?>
        <!DOCTYPE cross-domain-policy SYSTEM ""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"">
        <cross-domain-policy>
            <allow-access-from domain=""*"" />
        </cross-domain-policy>";
        return StringToStream(result);
    }

но я не понимаю следующие шаги, которые я должен сделать, чтобы вызовы Silverlight в WCF не вызывали исключения связи.

Не могли бы вы показать мне код, который я должен написать и где? (когда я гуглил, я не понимал, когда WCF вызывает запрос на получение политики доступа к клиенту, и какую конечную точку я должен добавить, я новичок в silverlight и WCF и точно не знаю, почему я должен добавить конечную точку ...)

это мой ServiceReference.ClientConfig:

    <configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IMapService" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:4693/MapService.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IMapService" contract="MapService.IMapService"
                name="BasicHttpBinding_IMapService" />
        </client>
    </system.serviceModel>
</configuration>

Спасибо!


person gln    schedule 06.02.2011    source источник
comment
Можете ли вы дать мне пример URL-адреса, где работает ваша служба? (например, myapp.com/service.svc)? Я могу лучше получить я. ответ с этим. Не стесняйтесь абстрагироваться от всего, что вам нужно, просто пример, из которого вы можете получить свое решение.   -  person Taylor Bird    schedule 06.02.2011
comment
@Taylor: вот пример: localhost:4693/MapService.svc   -  person gln    schedule 06.02.2011
comment
И когда вы переходите на localhost:4693/clientaccesspolicy.xml, что вы получаете?   -  person Taylor Bird    schedule 07.02.2011
comment
хорошо, так вот что мы должны решить. Как насчет localhost:4693/MapService.svc/clientaccesspolicy.xml   -  person Taylor Bird    schedule 10.02.2011


Ответы (1)


Стек Silverlight Http (HTTP clientaccesspolicy.xml)

Должен размещаться в корне вашего целевого домена. Можно легко проверить с помощью веб-браузера. Silverlight проверяет его автоматически один раз.

Сокеты Silverlight 3 (настраиваемый сервер политик)

Я уже сделал этот сервер политик для Silverlight для приложения Log2Console.

Я думаю, что этот код может помочь серверу политик SL.

Он должен быть размещен на специальном TCP-порту 943.

Сокеты Silverligt 4 (по умолчанию как в SL3, но можно выбрать для HTTP)

Задайте для свойства SocketAsyncEventArgs.SocketClientAccessPolicyProtocol в SocketAsyncEventArgs, переданном в Socket.ConnectAsync, значение SocketClientAccessPolicyProtocol.Http.

Диапазон возможных портов Silverlight

80, 443, 4502-4532 (если разрешено в clientaccesspolicy.xml)

Подробная документация

person Lex Lavnikov    schedule 06.02.2011
comment
Вам просто нужно разместить мой сервер политик на вашей стороне сервера. Silverlight автоматически вызывает сервер политик. И сервер политик не является HTTP-сервером, как хотелось бы, чтобы он был с WCF. - person Lex Lavnikov; 06.02.2011
comment
Вероятно, ваш порт находится в допустимом диапазоне - person Lex Lavnikov; 06.02.2011