C# ASP.Net核心Web API与ASP.Net WCF

C# ASP.Net核心Web API与ASP.Net WCF,c#,wcf,iis,asp.net-web-api,.net-core,C#,Wcf,Iis,Asp.net Web Api,.net Core,我使用ASP.net WCF和ASP.net核心Web API实现了一个简单的代码,可以使用post方法调用该代码 ASP.Net WCF: public class service : Iservice { public string banner() { return "OK"; } } [ServiceContract] public interface Iservice { [WebInvoke(Method="POST",UriTemplate = "/test",

我使用ASP.net WCF和ASP.net核心Web API实现了一个简单的代码,可以使用post方法调用该代码

ASP.Net WCF:

public class service : Iservice
{
    public string banner() { return "OK"; }
}

[ServiceContract]
public interface Iservice
{
    [WebInvoke(Method="POST",UriTemplate = "/test",                
        RequestFormat = WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json)]
    [OperationContract]
    string banner();       
} 
ASP.Net核心Web API:

[Route("api/[controller]")]
public class TodoController : Controller
{
    [HttpPost]
    public string item()
    {
        return "OK";
    }
}
program.cs
实现如下:

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseUrls("http://localhost:80")
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}
当我在IIS上托管这两个项目并使用由我实现的客户端时,WCF在每秒请求方面显示出更好的性能。客户端的实现如下所示:

static void Main(string[] args)
{
    int input = 10;
    int inst = 1000;
    Test(input, inst);
    Console.ReadLine();
}
async static void Test(int input, int inst)
{
    Task[] tasks = new Task[input];
    TimeSpan sp = new TimeSpan();
    Stopwatch sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < input; i++)
    {
        tasks[i] = myFunc(i, inst);
    }
    await Task.WhenAll(tasks);
    sw.Stop();
    Console.WriteLine("elappsed time: " + sw.ElapsedMilliseconds);
    Console.WriteLine("successfull requests: " + ((input * inst) - errorcounter));
    Console.WriteLine("unsuccessfull requests: " + (errorcounter));
    Console.WriteLine("average request per second are sent:" + (input * inst) * 1000 / sw.ElapsedMilliseconds);

}
static string baseAddress = "address to the service";
static int errorcounter = 0;
static object mylock = new object();
static Task myFunc(int i, int count)
{
    return Task.Run(async() =>
    {
        for (int j = 0; j < count; j++)
        {
            try
            {
                WebClient wc = new WebClient();
                await wc.UploadStringTaskAsync(baseAddress, "");
            }
            catch
            {
                lock (mylock)
                {
                    errorcounter++;
                }
            }
        }
    });
}
static void Main(字符串[]args)
{
int输入=10;
int inst=1000;
测试(输入,仪器);
Console.ReadLine();
}
异步静态无效测试(int输入,int inst)
{
任务[]任务=新任务[输入];
TimeSpan sp=新的TimeSpan();
秒表sw=新秒表();
sw.Start();
对于(int i=0;i
{
对于(int j=0;j
将此代码用作客户端WCF在我的系统中每秒可以处理160多个请求,但ASP.Net核心Web API每秒可以处理80个请求。这意味着WCF快了2倍?!?!但正如我在报告中所指出的,我认为应该处理更多的请求。他在这个网站上提到。 是否有一个特定的配置可以加速ASP.Net核心Web API?! 有人知道使用
kestrel
作为web服务器更好还是
weblistener

我必须提到,我使用IIS、IIS Express(在visual studio中)、使用更好的硬件(具有更多CPU、内核和ram)比较了这两个代码,得到了相同的结果


更新:

我必须提到我用来实现asp.net核心web api


更新2:

测试是使用另一台机器完成的,由于我们的业务类型,我们必须实现一个高性能的服务器,无论客户端如何使用此服务(同步连接或webclient中的异步/等待)


更新3:


我已经更新了客户端代码并使其异步化,以优化性能和结果。

您的测试完全没有用。它不使用异步,不缓存WebClient,不使用管道,使用适当的工具,如
wrk
进行http请求基准测试。请参阅官方asp.net核心基准测试存储库,了解一些示例命令和results@Tseng你是对的,但是请注意,中的测试不是为了可用性,我认为比较这两个测试是公平的(如果我没有错过像特殊配置这样的东西的话)!如果我想使用异步/等待或缓存webclient等。。。很明显,这两个系统都有改进!是的,但是你的测试没有意义。您正在循环中创建WebClient,因此您不仅仅是在测量客户端的创建。另外,您的ASP.NET核心应用程序没有使用异步,这实际上会导致线程不足,特别是当您的客户端由于不运行异步而阻塞线程时。因此,假设一个带有HT的4核CPU,客户端上有4个线程阻塞,服务器上有4个线程阻塞,可以同时运行。只需使用适当的工具进行测试,并在不同的机器上运行服务器和测试客户端。顺便说一句,您对第13轮数据的解释是完全错误的。ASP.NET核心在静态页面服务等方面速度很快,但在其他类别中则没有那么快。此外,使用应用程序洞察可以在一定程度上降低web应用程序的速度。人们选择ASP.NET Core有很多原因,性能不是唯一的原因。正如Lex已经指出的,这甚至不是一个苹果对苹果的比较,因为(大概)WCF示例没有使用Application Insights遥测。在我看来,更好的方法是选择一个您熟悉的框架,并以一种水平可伸缩的方式编写您的应用程序。如果需要更高的性能,请在群集中添加更多计算机。
static void Main(string[] args)
{
    int input = 10;
    int inst = 1000;
    Test(input, inst);
    Console.ReadLine();
}
async static void Test(int input, int inst)
{
    Task[] tasks = new Task[input];
    TimeSpan sp = new TimeSpan();
    Stopwatch sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < input; i++)
    {
        tasks[i] = myFunc(i, inst);
    }
    await Task.WhenAll(tasks);
    sw.Stop();
    Console.WriteLine("elappsed time: " + sw.ElapsedMilliseconds);
    Console.WriteLine("successfull requests: " + ((input * inst) - errorcounter));
    Console.WriteLine("unsuccessfull requests: " + (errorcounter));
    Console.WriteLine("average request per second are sent:" + (input * inst) * 1000 / sw.ElapsedMilliseconds);

}
static string baseAddress = "address to the service";
static int errorcounter = 0;
static object mylock = new object();
static Task myFunc(int i, int count)
{
    return Task.Run(async() =>
    {
        for (int j = 0; j < count; j++)
        {
            try
            {
                WebClient wc = new WebClient();
                await wc.UploadStringTaskAsync(baseAddress, "");
            }
            catch
            {
                lock (mylock)
                {
                    errorcounter++;
                }
            }
        }
    });
}