Я потратил пару часов на поиски этой ошибки и проверил почти все, что есть в Google.
Я хочу получить доступ к службе, используя TCP, .NET4 и VS2010, в C #.
У меня очень маленький сервис:
namespace WcfService_using_callbacks_via_tcp
{
[ServiceContract(CallbackContract = typeof(ICallback), SessionMode = SessionMode.Required)]
public interface IService1
{
[OperationContract]
string Test(int value);
}
public interface ICallback
{
[OperationContract(IsOneWay = true)]
void ServerToClient(string sms);
}
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service1 : IService1
{
public string Test(int value)
{
ICallback the_callback = OperationContext.Current.GetCallbackChannel<ICallback>();
the_callback.ServerToClient("Callback from server, waiting 1s to return value.");
Thread.Sleep(1000);
return string.Format("You entered: {0}", value);
}
}
}
С этим Web.config:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfService_using_callbacks_via_tcp.Service1" behaviorConfiguration="Behaviour_Service1">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:5050/Service1" />
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" bindingConfiguration="DuplexNetTcpBinding_IService1" contract="WcfService_using_callbacks_via_tcp.IService1"/>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="mexTcp" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<!--
TCP Binding
-->
<netTcpBinding>
<binding name="DuplexNetTcpBinding_IService1" sendTimeout="00:00:01"
portSharingEnabled="true">
</binding>
<binding name="mexTcp" portSharingEnabled="true">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<!--
Behaviour to avoid a rush of clients and to expose metadata over tcp
-->
<behavior name="Behaviour_Service1">
<serviceThrottling maxConcurrentSessions="10000"/>
<serviceMetadata httpGetEnabled="true"/>
</behavior>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
И этот код для его размещения:
static void Main(string[] args)
{
Uri base_address = new Uri("net.tcp://localhost:5050/Service1");
ServiceHost host = null;
try
{
// Create the server
host = new ServiceHost(typeof(Service1), base_address);
// Start the server
host.Open();
// Notify it
Console.WriteLine("The service is ready at {0}", base_address);
// Allow close the server
Console.WriteLine("Press <Enter> to stop the service.");
Console.ReadLine();
// Close it
host.Close();
}
catch (Exception ex)
{
// Opus an error occurred
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(string.Format("Host error:\r\n{0}:\r\n{1}", ex.GetType(), ex.Message));
Console.ReadLine();
}finally
{
// Correct memory clean
if(host != null)
((IDisposable)host).Dispose();
}
}
Теперь я хочу создать клиента, но мне это не представляется возможным. Я использовал Add Service Reference и svcutil напрямую, но получаю эту ошибку:
C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC> svcutil.exe
net.tcp: // loc alhost: 5050 / Service1 Модель обслуживания Microsoft (R)
Инструмент метаданных [Microsoft (R) Windows (R) Communication Foundation,
Версия 4.0.30319.1] Авторское право (c) Microsoft Corporation. Все права
зарезервирован.
Попытка загрузки метаданных из
'net.tcp: // localhost: 5050 / Service1' с использованием W S-метаданных Exchange. это
URL не поддерживает DISCO. Инструмент метаданных сервисной модели Microsoft (R)
[Microsoft (R) Windows (R) Communication Foundation, версия
4.0.30319.1] Авторское право (c) Microsoft Corporation. Все права защищены.
Ошибка: невозможно получить метаданные из net.tcp: // localhost: 5050 / Service1
Если это служба Windows (R) Communication Foundation, к которой вы
есть доступ, проверьте, что вы включили публикацию метаданных
по указанному адресу. Для получения помощи по включению публикации метаданных,
пожалуйста, обратитесь к документу MSDN по адресу
http://go.microsoft.com/fwlink/?LinkId=65455.
Ошибка обмена метаданными WS
URI: net.tcp: // localhost: 5050 / Service1
Метаданные содержат ссылку, которая не может быть разрешена: 'net.tcp: // localhost: 5050 / Service1'.
Соединение с сокетом было прервано. Это может быть вызвано ошибкой при обработке вашего сообщения или превышением времени ожидания приема
удаленный хост или проблема с сетевым ресурсом. Местный
таймаут сокета был '00: 04: 59.9863281 '.
Запрет на временное прекращение существования в настоящее время.
Если вам нужна дополнительная помощь, введите "svcutil /?"
Итак, я могу разместить службу без проблем, но не могу создать прокси.
Я перепробовал почти любой найденный конфиг, но я думаю, что текущий файл web.config правильный. Есть поведения, безопасность и привязки, использующие mex, используемые конечными точками.
Я попытался создать файл app.config и установить его в той же папке с svcutil.exe.