Compact Framework для связи с WCF без использования созданных прокси NETCFSvcUtil - PullRequest
4 голосов
/ 24 сентября 2010

Можно ли обмениваться данными со службой WCF без использования NETCFSvcUtil для создания прокси?

Я пытаюсь вызвать службу WCF на мобильном устройстве с помощью компактной среды. Я не хочу использовать NETCFSvcUtil для генерации прокси по определенной причине .

У меня есть этот пример кода на мобильной стороне для его проверки:

    // This is the contract defined at the client side (mobile device)
    public interface IService1
    {
        string GetData(int value);
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                string address = "http://192.168.30.88:8731/Design_Time_Addresses/WcfServiceLibrary1/Service1/";

                // It throws here ....
                var channelFactory = CreateDefaultBinding().BuildChannelFactory<IService1>(new System.ServiceModel.Channels.BindingParameterCollection());
                var channel = channelFactory.CreateChannel(new EndpointAddress(new Uri(address)));
                var result = channel.GetData(5);
                this.Text = result.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        public static System.ServiceModel.Channels.Binding CreateDefaultBinding()
        {
            System.ServiceModel.Channels.CustomBinding binding = new System.ServiceModel.Channels.CustomBinding();
            binding.Elements.Add(new System.ServiceModel.Channels.TextMessageEncodingBindingElement(System.ServiceModel.Channels.MessageVersion.Soap11, System.Text.Encoding.UTF8));
            binding.Elements.Add(new System.ServiceModel.Channels.HttpTransportBindingElement());

            return binding;
        }
    }

Но я получаю это исключение: запрошен тип канала 'CallingWCFFromDevice.IService1', но Binding 'CustomBinding 'не поддерживает его или неправильно настроен для его поддержки.Имя параметра: TChannel

Любой ключ к пониманию того, что происходит?Я предполагаю, что я не использую BuildChannelFactory правильно ...

1 Ответ

0 голосов
/ 24 сентября 2010

Я не уверен, какие у вас требования к безопасности, но может быть проще использовать одну из предопределенных привязок, такую ​​как BasicHttpBinding; что сделало бы ваш код что-то вроде следующего:

        IService1 channel = null;
        try {
            BasicHttpBinding binding = new BasicHttpBinding();
            EndpointAddress address = new EndpointAddress("http://192.168.30.88:8731/Design_Time_Addresses/WcfServiceLibrary1/Service1/");
            IChannelFactory<IService1> factory = binding.BuildChannelFactory<IService1>(new BindingParameterCollection());
            channel = factory.CreateChannel(address);
            // Use the channel here...
        }
        finally {
            if(channel != null && ((ICommunicationObject)channel).State == CommunicationState.Opened) {
                ((ICommunicationObject)channel).Close();
            }
        }

В своем определении IService1 вы не включаете ни одного из необходимых атрибутов, для интерфейса требуется применение атрибута ServiceContractAttribute, а для метода в интерфейсе требуется применение атрибута OperationContractAttribute следующим образом:

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