2013-12-25 2 views
6

Я новичок в службах WCF, и я создал одно и то же приложение с использованием WCF. Пожалуйста, смотрите ниже основного кода:Как настроить привязку net.tcp для клиента в WCF

IService1.cs:

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    string GetData(int value); 

    [OperationContract] 
    CompositeType GetDataUsingDataContract(CompositeType composite); 

    [OperationContract] 
    String WelComeMessage(String name); 
} 

Service1.svc.cs:

public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 

    public CompositeType GetDataUsingDataContract(CompositeType composite) 
    { 
     if (composite == null) 
     { 
      throw new ArgumentNullException("composite"); 
     } 

     if (composite.BoolValue) 
     { 
      composite.StringValue += "Suffix"; 
     } 

     return composite; 
    } 

    public String WelComeMessage(String name) 
    { 
     return String.Format("{0}, Welcome to http://www.csharptutorial.in", name); 
    } 
} 

и web.config:

<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

Я хочу, чтобы сделать эту услугу net.tcp связывания готова, может кто-нибудь мне помогает понять, где объявить привязку net.tcp и как использовать эту услугу, используя привязку net.tcp?

Edit 1:

Я обновил файл конфигурации сервера (в файле конфигурации службы WCF) ниже:

<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service name="DemoWCF.Service1" 
       behaviorConfiguration="MyServiceBehavior"> 
     <endpoint name="NetTCPBinding_IService1Client" 
        address="net.tcp://localhost:10109/Service1.svc" 
        binding="netTcpBinding" 
        bindingConfiguration="EndPointConfiguration" 
        contract="DemoWCF.IService1" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://localhost:10109/Service1" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 

    <bindings> 
     <netTcpBinding> 
     <binding name="NetTCPBinding_IService1" sendTimeout="00:01:00"> 
      <security mode="None" /> 
     </binding> 
     </netTcpBinding> 
    </bindings> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceBehavior"> 
      <serviceMetadata httpGetEnabled="false"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      <dataContractSerializer maxItemsInObjectGraph="65536" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 

и ниже код на стороне клиента:

static void Main(string[] args) 
     { 
      try 
      { 
       Service1Client service1Client = new Service1Client("NetTCPBinding_IService1"); 
       Console.WriteLine(service1Client.WelcomeMessage("Hello from net.tcp")); 
       Console.ReadLine(); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 

     } 

Но это исключает:

Исключение: Вы попытались создать канал для службы, которая не поддерживает .Net Framing. Возможно, вы столкнулись с конечной точкой HTTP.

Внутренняя Исключение:

{ "Ожидаемый тип записи 'PreambleAck', нашел '72'"}

Edit 2:

Я принимал мою службу WCF в IIS 7.5 и добавлена ​​привязка net.tcp с использованием опции редактирования привязки .... а также из командной строки:

множества сайтов "DemoWCF" - + привязок. [протокол = 'net.tcp', bindingInformation = '10108 *']

Веб-сервис показывает работает отлично.

enter image description here

Но потребляя эту WCF службу на стороне клиента еще же исключения.

Client Код:

try 
{ 
    ServiceReference1.Service1Client s = new ServiceReference1.Service1Client(); 
    Response.Write(s.WelcomeMessage("Hello from net.tcp")); 
    Response.End(); 
} 
catch (Exception ex) 
{ 
    Response.Write(ex); 
    Response.End(); 
} 

Client Web.конфигурации:

<bindings> 
    <netTcpBinding> 
    <binding name="NetTCPBinding_IService1Client"> 
     <security mode="None" /> 
    </binding> 
    </netTcpBinding> 
</bindings> 
<client> 
    <endpoint address="net.tcp://localhost:10108/Service1.svc" binding="netTcpBinding" 
    bindingConfiguration="NetTCPBinding_IService1Client" contract="ServiceReference1.IService1" 
    name="NetTCPBinding_IService1Client" /> 
</client> 

же Исключение: Вы пытались создать канал к службе, которая не поддерживает .Net Framing. Возможно, вы столкнулись с конечной точкой HTTP.

Внутренняя Исключение:

{ "Ожидаемый тип записи 'PreambleAck', нашел '72'"}

Edit 3:

Пробовал потребляя услуги по ниже кода тоже :

IService1 vService; 

       NetTcpBinding b = new NetTcpBinding(); 
       b.Security.Mode = SecurityMode.Message; 
       b.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 

       EndpointAddress vEndPoint = new EndpointAddress("net.tcp://localhost:10108/Service1/"); 
       ChannelFactory<IService1> cf = new ChannelFactory<IService1>(b, vEndPoint); 

       vService = cf.CreateChannel(); 

       try 
       { 
        Response.Write("Result from the system " + vService.WelcomeMessage("Hello")); 
       } 
       catch (Exception ex) 
       { 
        Response.Write("Error Occured while connection establish to " + vEndPoint.Uri.ToString()); 
       } 
       Response.End(); 

По-прежнему получает то же исключение, может ли кто-нибудь помочь?

+0

Попробуйте изменить конечную точку 'client web.config' на' net.tcp: // localhost: 10108/Service1' – Sam

+0

У меня возникла эта проблема, потому что номера портов несколько отличались между клиентом и сервером. – StingyJack

ответ

3

Вам нужно что-то похожее на это

<system.serviceModel> 
<services> 
    <service name="MyApp.Service1" 
      behaviorConfiguration="MyServiceBehavior"> 
    <endpoint name="MyEndPoint" 
       address="net.tcp://localhost:9000/Service1" 
       binding="netTcpBinding" 
       bindingConfiguration="EndPointConfiguration" 
       contract="MyApp.IService1" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://localhost:9000/Service1" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="True" /> 
     <dataContractSerializer maxItemsInObjectGraph="65536" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<bindings> 
    <netTcpBinding> 
    <binding name="EndPointConfiguration" 
      sendTimeout="00:01:00"> 
     <security mode="None" /> 
    </binding> 
    </netTcpBinding> 
</bindings> 

'MyApp.Service1' - означает полное имя службы, в том числе имен. «MyApp.IService1» - означает полное имя интерфейса службы, включая пространство имен, которое реализует служба.

+0

Еще один глупый вопрос: нужно ли добавлять эти настройки в файл client.config клиента, правильно? –

+0

@DhavalPanchal: нет, вам нужно добавить их в боковую конфигурацию ** SERVER **. В конце концов, вы определяете '' и ее конечную точку, которая находится на ** стороне сервера **. Затем ваш клиентский код должен создать прокси-сервер на стороне клиента для этой конечной точки службы, и тогда будет добавлен тот же конфиг в файлы конфигурации на стороне клиента. –

+0

@Destroer: я обновил вопрос. –