Brug af ChannelFactory med WCF, kan ikke se et custom objekt
Pkt.1Jeg har lavet en simpel WCF service. Blot udstillet den template service, der er tilstede, når man opretter en Service.svc.
Den ser ser således ud:
using System;
public class Service : IService
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
Det tilhørende interface:
using System.Runtime.Serialization;
using System.ServiceModel;
[ServiceContract]
public interface IService
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
[DataContract]
public class CompositeType
{
[DataMember]
public bool BoolValue { get; set; }
[DataMember]
public string StringValue { get; set; }
}
Pkt.2
Jeg har lavet følgende klient.
using System.ServiceModel;
class Program
{
static void Main(string[] args)
{
var binding = new BasicHttpBinding();
var endpoint = new EndpointAddress("http://localhost:52250/Service.svc");
var client = ChannelFactory<IService>.CreateChannel(binding, endpoint);
var data = client.GetData(500);
var result = client.GetDataUsingDataContract(new CompositeType { BoolValue = true, StringValue = "XXX" });
}
}
Hvori jeg har kopieret mit IService interface ind, så det også er tilgængeligt i dette klient projekt.
Der findes følgende ServiceClient klasse:
using System;
using System.ServiceModel;
public class ServiceClient<TContract> : IDisposable where TContract : class
{
private TContract _client;
public ServiceClient(string endpointName)
{
var f = new ChannelFactory<TContract>(endpointName);
this._client = f.CreateChannel();
}
public TResult ServiceOperation<TResult>(Func<TContract, TResult> operation)
{
return operation(this._client);
}
public void ServiceOperation(Action<TContract> operation)
{
operation(this._client);
}
public void Dispose()
{
try
{
if (this._client != null)
{
var channel = this._client as IClientChannel;
if (channel != null && channel.State == CommunicationState.Faulted)
{
channel.Abort();
}
else
{
channel.Close();
}
}
}
finally
{
this._client = null;
GC.SuppressFinalize(this);
}
}
}
Mit var data objekt får fint følgende retur: "You entered: 500", men mit var result er helt tomt. Der er false og null i svaret tilbage.
Jeg har prøvet at debugge min service, men min GetDataUsingDataContract metode bliver kaldt fint, men argumentet er tomt dvs. der står false og null i det, min service modtager.
Hvad gør jeg galt / mangler jeg :(