Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > SilverLight WCF net.TCP


Автор: mvc 16.5.2011, 22:38
Есть приложения которое реализовано на SilverLight передаю данные на СЛ с помощью  WCF net.tcp .
Создал WCFlib птом создал Windows Service написал апп.конфиг 

Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.web>
    <compilation debug="true" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfServiceLibrary.ServiceBehavior">
          <serviceMetadata />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="WcfServiceLibrary.ServiceBehavior"
          name="WcfServiceLibrary.Service">
        <endpoint address="" binding="netTcpBinding" bindingConfiguration="b1"
            contract="WcfServiceLibrary.IService" />
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:4504/Service" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <bindings>
      <netTcpBinding>
        <binding name="b1">
          <security mode="None"/>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>




</configuration>


Добавил референс в СЛ сгенерило СервайсРеференс.клиенконфиг
Код

<configuration>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="NetTcpBinding_IService">
                    <binaryMessageEncoding />
                    <tcpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost:4504/Service" binding="customBinding"
                bindingConfiguration="NetTcpBinding_IService" contract="ServiceAC.IService"
                name="NetTcpBinding_IService" />
        </client>
    </system.serviceModel>
</configuration>


при запуске выдает ошибку 

Could not connect to net.tcp://localhost:4504/Service. The connection attempt lasted for a time span of 00:00:00.3380193. TCP error code 10013: An attempt was made to access a socket in a way forbidden by its access permissions.. This could be due to attempting to access a service in a cross-domain way while the service is not configured for cross-domain access. You may need to contact the owner of the service to expose a sockets cross-domain policy over HTTP and host the service in the allowed sockets port range 4502-4534.

КлиентАксесПолиси.хмл закинул во все свои проджекты не помагает

 КлиентАксесПолиси.хмл
Код

<?xml version="1.0" encoding ="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from>
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <socket-resource port="4502-4506" protocol="tcp" />
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>


в чем проблема, помогите.  smile 

Автор: -Mikle- 17.5.2011, 00:07
Вы не можете использовать net.tcp в силверлайте, если на стороне сервера не стоит IIS7 с настроенным WAS.

Цитата(mvc @  17.5.2011,  01:38 Найти цитируемый пост)
КлиентАксесПолиси.хмл закинул во все свои проджекты не помагает

Его надо закидывать не во все проджекты, а в корень веб-сайта, который хостит ваш сервис. В вашем случае сайта нет и вам необходимо вернуть его самим сервисом настроив http-maping.

Автор: mvc 17.5.2011, 10:13
у меня вцф сервайс не на иис хостится а на Windows service как сетевая служба виндовс, получается нужно делать еще один ендПоинт на хттп биндинг?

Автор: -Mikle- 17.5.2011, 10:49
Цитата(mvc @  17.5.2011,  13:13 Найти цитируемый пост)
получается нужно делать еще один ендПоинт на хттп биндинг?

Как минимум, вам нужно научить ваш сервис возвращать ClientAccessPolicy.xml Где-то я видел как это делать, там все просто через хттп-мапинг (некий хттп-запрос мапится на метод, который и возвращает эксэмэлку). Но я все равно не уверен, можно ли силверлайт подружить с вин-сервисом, не пробовал связку. Экспериментируйте и о результатах пишите.

Автор: mvc 18.5.2011, 10:01
 smile 
Добавляем новый интерфейс для сервиса(WCF)
Код

using System.IO;
using System.ServiceModel;
using System.ServiceModel.Web;


namespace WcfServiceLibrary
{
    [ServiceContract]
    public interface IClientAccessPolicy
    {
        [OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
        Stream GetClientAccessPolicy();
    }


в коде сервиса реализуем его
Код

namespace WcfServiceLibrary
{
    public class Service : IService , IClientAccessPolicy
    {
        public Service()
        {
                     
        }
//IService реализуем тоже тут
//
//
//
[OperationBehavior]
        public Stream GetClientAccessPolicy()
        {
            const string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
                <access-policy>
                  <cross-domain-access>
                    <policy>
                      <allow-from http-request-headers=""http://google.com"">
                        <domain uri=""*"" />
                      </allow-from>
                      <grant-to>
                        <socket-resource port=""4502-4534"" protocol=""tcp"" />
                      </grant-to>
                    </policy>
                  </cross-domain-access>
                </access-policy>";

            if (WebOperationContext.Current != null)
                WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
            return new MemoryStream(Encoding.UTF8.GetBytes(result));
        }
}


пишем мего конфиг
Код

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true"/>
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfServiceLibrary.ServiceBehavior">
          <serviceMetadata/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
        <behavior name="enableMetaData" >
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webHttpBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="enableMetaData" name="WcfServiceLibrary.Service">
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:4504"/>
            <add baseAddress="http://localhost:80"/>
          </baseAddresses>
        </host>
        <endpoint address="Tcp" binding="netTcpBinding" bindingConfiguration="b1" contract="WcfServiceLibrary.IService"/>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
        <endpoint address="Http" binding="basicHttpBinding" contract="WcfServiceLibrary.IService" />
        <endpoint address="" binding="webHttpBinding" behaviorConfiguration="webHttpBehavior" contract="WcfServiceLibrary.IClientAccessPolicy" />

      </service>
    </services>
    <bindings>
      <netTcpBinding>
        <binding name="b1">
          <security mode="None"/>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>




  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>



также в проджекты сервисов добавляем файл хмл 
Код

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="http://google.com">
        <domain uri="*" />
      </allow-from>
      <grant-to>
        <socket-resource port="4502-4534" protocol="tcp" />
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

в Program.cs пишем такой код
Код

 using (var host = new ServiceHost(typeof(Service)))
            {
                host.Open();
                Console.WriteLine("Service is running...");
                Console.WriteLine("Service address: "+host.BaseAddresses[0]);
                Console.Read();
            }


на "Любимый SIlverLight"  smile  добавляем референс сервиса 

должны добавить нет.тсп иначе будет ругаться что сервайс передает СОАП

http://imageshack.us/photo/my-images/691/201105180953.jpg/



после добавления должно сгенерить такой ServiceReferences.ClientConfig

Код

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
            <customBinding>
                <binding name="NetTcpBinding_IService">
                    <binaryMessageEncoding />
                    <tcpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            
            <endpoint address="net.tcp://localhost:4504/Tcp" binding="customBinding"
                bindingConfiguration="NetTcpBinding_IService" contract="ServiceRef.IService"
                name="NetTcpBinding_IService" />
            <endpoint address="http://localhost/Http" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService" contract="ServiceRef.IService"
                name="BasicHttpBinding_IService" />
        </client>
    </system.serviceModel>
</configuration>


когда добавили сервайс сам захоститься VS и при переходе на http://127.0.0.1/ClientAccessPolicy.xml
должны увидеть такую картинку  smile 

http://imageshack.us/photo/my-images/196/201105180956clientacces.jpg/

если есть вопросы пишите Skype: freedomdim
или [email protected]

Автор: -Mikle- 18.5.2011, 13:07
Это именно то, про что я говорил (типа хттп-мапинг на метод). Спасибо, что отписался с решением.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)