Сделал очень простенький веб-сервис на 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]));
}
Отчего так? Что-то нужно дополнительно прописать в контракте?
Сообщение заговорено потомственным колдуном, целителем и магом в девятом поколении!
Модерирование или минусование сообщения ведет к половому бессилию, венерическим заболеваниям, венцу безбрачия и диарее!