Я создаю простой хост wcf в консольном приложении. Это не работает, и исключение не имеет смысла:/ Исключение выглядит очень странно:
"ContractDescription 'IFooService' не имеет операций; контракт должен иметь хотя бы одну операцию."
потому что вот код, и у меня есть операция:
[ServiceContract]
public interface IFooService
{
[OperationContract]
void DoNothing();
[OperationContract]
int GetFoo(int i);
}
public class FooService : IFooService
{
public void DoNothing()
{
}
public int GetFoo(int i)
{
return i + 1;
}
}
class Program
{
static void Main(string[] args)
{
try
{
string address = "http://localhost:9003/FooService";
Uri addressBase = new Uri(address);
var svcHost = new ServiceHost(typeof(FooService), addressBase);
BasicHttpBinding bHttp = new BasicHttpBinding();
Type contractType = typeof(IFooService);
ContractDescription contractDescription = new ContractDescription(contractType.Name);
contractDescription.ProtectionLevel = ProtectionLevel.None;
contractDescription.ContractType = contractType;
contractDescription.ConfigurationName = contractType.FullName;
contractDescription.SessionMode = SessionMode.NotAllowed;
svcHost.AddServiceEndpoint(new ServiceEndpoint(contractDescription, bHttp, new EndpointAddress(address)));
svcHost.Open();
Console.WriteLine("\n\nService is Running as >> " + address);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.ReadKey();
}
}
Это в основном весь код. App.config остается нетронутым:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>
EDIT: Небольшая подсказка, как это работает: я не менял службу или контракт, но переместил конфигурацию в App.config, поэтому изменил только метод Main:
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<system.serviceModel>
<services>
<service name="WcfDemos.ConsoleHost.FooService">
<endpoint address="http://localhost:9003/FooService" binding="basicHttpBinding"
contract="WcfDemos.ConsoleHost.IFooService" />
</service>
</services>
</system.serviceModel>
</configuration>
Главный:
static void Main(string[] args)
{
try
{
string address = "http://localhost:9003/FooService";
Uri addressBase = new Uri(address);
var svcHost = new ServiceHost(typeof(FooService), addressBase);
svcHost.Open();
Console.WriteLine("\n\nService is Running as >> " + address);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.ReadKey();
}
IFooService
тоже не должны быть общедоступными? - person VDN   schedule 23.02.2016