Windows サービスによってホストされている WCF サービスがあります。それは機能しますが、呼び出しは非常に遅いですvoid Test()
。クライアント呼び出しからサーバー受信まで約 500 ミリ秒かかります。
いくつかの異なる構成を試しましたが、それを高速化することに成功しませんでした。クライアントとサーバーの両方が同じマシン上にあります。
コードは次のとおりです。
Shared.dll
:
[ServiceContract]
public interface IContract
{
[OperationContract]
void Test();
}
Server.exe
:
public class Service : IContract
{
public void Test()
{
this.Log("Test: " + DateTime.Now.TimeOfDay);
}
}
Client.exe
:
var binding = ...;
var factory = new ChannelFactory<IContract>(binding, "net.tcp://localhost/Service");
var service = factory.CreateChannel();
this.Log("Test: " + DateTime.Now.TimeOfDay);
service.Test();
app.config
:
<system.serviceModel>
<services>
<service behaviorConfiguration="ServiceBehavior" name="Server.Service">
<endpoint address="Service" binding="netTcpBinding" bindingConfiguration="NetTcp" contract="Shared.IContract">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost/" />
</baseAddresses>
</host>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="NetTcp" portSharingEnabled="true">
<security mode="None">
<message clientCredentialType="None"/>
<transport protectionLevel="None" clientCredentialType="None"/>
</security>
<reliableSession enabled="false" />
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
編集
私は現在、同じマシンのクライアントとサーバーでこれをテストしていますが、実稼働用にそれらを別のマシンに置くことを考えています。
ここでは、ファクトリとチャネルの作成が原因ではありません。Thread.Sleep(20000)
作成とログの間にを入れることを除外したところ、同じ結果が得られました。
クライアント ログとサーバー ログの違いは、最初の呼び出しでは約 500 ミリ秒 (実際には 300 ミリ秒から 1 秒の間) ですが、それ以上の への呼び出しでは 5 ミリ秒未満続きますTest()
。最初の呼び出しを含め、関数を常に非常に高速にしたいと考えています。どうやってやるの?