Вебсервис WCF: опциональный параметр?
От: Кондраций Россия  
Дата: 12.10.10 12:26
Оценка:
Сделал очень простенький веб-сервис на WCF.
  Здесь код, жирным выделен контракт сервиса
Сам сервис:
using System.Runtime.Serialization;
using System.ServiceModel;

namespace Server.Service
{
    #region ComplexData
    [DataContract]
    public class ComplexData
    {
        #region Constructor's

        public ComplexData(string strValue, int intValue)
        {
            StrValue = strValue;
            IntValue = intValue;
        }

        #endregion

        #region StrValue

        [DataMember]
        public string StrValue
        {
            get;
            set;
        }

        #endregion

        #region IntValue

        [DataMember]
        public int IntValue
        {
            get;
            set;
        }

        #endregion
    }

    #endregion

    #region IService

    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        string GetStrValue(int intVal);

        [OperationContract]
        ComplexData GetComplexData(int intVal);
    }    #endregion

    #region ServiceImpl

    class ServiceImpl: IService
    {
        public string GetStrValue(int intVal)
        {
            return intVal.ToString();
        }

        public ComplexData GetComplexData(int intVal)
        {
            return new ComplexData( intVal.ToString(), intVal );
        }
    }

    #endregion
}


Создание экземпляра сервиса:

using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using Server.Service;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:8000/Service");

            var host = new ServiceHost(typeof(ServiceImpl), baseAddress);
            using(host)
            {
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                host.Description.Behaviors.Add(smb);

                var httpEndPointAdress = baseAddress + "/http";
                var httpEndPoint = host.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), httpEndPointAdress);

                host.Open();

                Console.WriteLine("Host started.");
                Console.WriteLine("Press any key...");
                Console.ReadKey( true );

                host.Close();
            }
        }
    }
}


В другом проекте сделал Web Reference (а не Service Reference) на этот сервер. Сработало. Но почему-то для методов сервиса в прокси был сгенерирован дополнительный булевый параметр, т.е. было
[OperationContract]
string GetStrValue(int intVal);

а сгенерировалось (доп.параметр выделен жирным)
        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/IService/GetStrValue", 
RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", 
Use=System.Web.Services.Description.SoapBindingUse.Literal, 
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        [return: System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string GetStrValue(int intVal, [System.Xml.Serialization.XmlIgnoreAttribute()] bool intValSpecified) {
            object[] results = this.Invoke("GetStrValue", new object[] {
                        intVal,
                        intValSpecified});
            return ((string)(results[0]));
        }


Отчего так? Что-то нужно дополнительно прописать в контракте?
Сообщение заговорено потомственным колдуном, целителем и магом в девятом поколении!
Модерирование или минусование сообщения ведет к половому бессилию, венерическим заболеваниям, венцу безбрачия и диарее!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.