Es gibt ein WCF-Beispiel mit dem Namen LocalChannel, das von Microsoft bereitgestellt wird, um zu zeigen, wie eine benutzerdefinierte Bindung implementiert werden kann, um unnötigen Overhead beim Aufrufen eines Dienstes in derselben ApplicationDomain zu umgehen. Es ist die Probe Beschreibung angegeben wird, dass:Warum Serialisierung bei Verwendung von LocalChannel in WCF durchgeführt?
Diese Szenarien nützlich, in denen der Kunden und der Service in der gleichen Anwendungsdomäne und den Overhead des typischen WCF Kanalstapels (Serialisierung und Deserialisierung von Nachrichten) ausgeführt wird, muss Gemieden werden.
Ich habe diesen Code in meinem Projekt verwendet, aber trotz der Behauptung scheint es, dass Serialisierung stattfindet, wenn ein Dienst aufgerufen wird.
Um es klarer zu machen Ich habe den Code in den folgenden geändert, um einen Datenvertrag zu verwenden, so dass leicht festgestellt werden kann, ob die Serialisierung durchgeführt wird oder nicht.
# region Service Contract
[ServiceContract]
public interface IGetPrice
{
[OperationContract]
ProductDTO GetPriceForProduct(int productCode);
}
[DataContract]
public class ProductDTO
{
private string _price;
public ProductDTO(string price)
{
_price = price;
}
#region Overrides of Object
public override string ToString()
{
return string.Format("Price = '{0}'", _price);
}
#endregion
[DataMember]
public string Price
{
get { return _price; }
set { _price = value; }
}
}
public class GetPrice : IGetPrice
{
#region IGetPrice Members
public ProductDTO GetPriceForProduct(int productId)
{
return new ProductDTO((String.Format("The price of product Id {0} is ${1}.",
productId, new Random().Next(50, 100))));
}
#endregion
}
# endregion
internal class Program
{
private static void Main(string[] args)
{
var baseAddress = "net.local://localhost:8080/GetPriceService";
// Start the service host
var host = new ServiceHost(typeof (GetPrice), new Uri(baseAddress));
host.AddServiceEndpoint(typeof (IGetPrice), new LocalBinding(), "");
host.Open();
Console.WriteLine("In-process service is now running...\n");
// Start the client
var channelFactory
= new ChannelFactory<IGetPrice>(new LocalBinding(), baseAddress);
var proxy = channelFactory.CreateChannel();
// Calling in-process service
var priceForProduct = proxy.GetPriceForProduct(101);
Console.WriteLine("Calling in-process service to get the price of product Id {0}: \n\t {1}"
, 101, priceForProduct);
Console.WriteLine("Calling in-process service to get the price of product Id {0}: \n\t {1}"
, 202, proxy.GetPriceForProduct(202));
Console.WriteLine("Calling in-process service to get the price of product Id {0}: \n\t {1}"
, 303, proxy.GetPriceForProduct(303));
Console.WriteLine("\nPress <ENTER> to terminate...");
Console.ReadLine();
}
}
Ausführen dieses Codes zeigt an, dass ‚Preis‘ Eigentum ‚ProductDTO‘ Klasse ist serialisiert und während der Gespräche über localbinding deserialisiert!
Hat jemand diese Methode schon einmal benutzt oder weiß, ob etwas nicht stimmt?
Ich schätze Ihre schnelle Antwort – Gholamreza