Общий сервисный контракт - PullRequest
1 голос
/ 02 июня 2011

Мне нужен общий сервисный контракт, но если я это сделаю, я получу эту ошибку:

[ServiceContract]
public interface IService<T> where T : MyClass
{
    [OperationContract]
    void DoWork();
}

Имя контракта 'x.y' не найдено в списке контрактов, реализованных сервисом 'z.t'.

Ответы [ 3 ]

0 голосов
/ 02 июня 2011

Ваш сервисный контракт не совместим. Невозможно выставить подобные дженерики через WSDL.

Взгляните на эту статью ( ссылка ) для возможного обходного пути.

0 голосов
/ 19 ноября 2014

Если вы используете сервисную ссылку на клиентской стороне, генерик потерпит неудачу.

Используйте следующее на стороне клиента с generic:

var myBinding = new BasicHttpBinding();
var myEndpoint = new EndpointAddress("");
var myChannelFactory = new ChannelFactory<IService>(myBinding, myEndpoint);
IService gks = myChannelFactory.CreateChannel();
0 голосов
/ 02 июня 2011

Пока вы используете закрытый шаблон для вашего интерфейса, он работает - см. Ниже. Чего вы не можете сделать, так это иметь открытый дженерик в качестве типа контракта.

public class StackOverflow_6216858_751090
{
    public class MyClass { }
    [ServiceContract]
    public interface ITest<T> where T : MyClass
    {
        [OperationContract]
        string Echo(string text);
    }
    public class Service : ITest<MyClass>
    {
        public string Echo(string text)
        {
            return text;
        }
    }
    static Binding GetBinding()
    {
        BasicHttpBinding result = new BasicHttpBinding();
        //Change binding settings here
        return result;
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest<MyClass>), GetBinding(), "");
        host.Open();
        Console.WriteLine("Host opened");

        ChannelFactory<ITest<MyClass>> factory = new ChannelFactory<ITest<MyClass>>(GetBinding(), new EndpointAddress(baseAddress));
        ITest<MyClass> proxy = factory.CreateChannel();
        Console.WriteLine(proxy.Echo("Hello"));

        ((IClientChannel)proxy).Close();
        factory.Close();

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...