问题 如何检查Rest API是打开还是关闭

Raysefo

知名会员
已加入
2019年2月22日
留言内容
194
编程经验
10+

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
Web API不会退出以表明它是否正在运行。您需要联系它,看看是否收到预期的答复。它必须处于运行状态才能告诉您它没有以任何其他方式运行。 ping是联系服务器并获得回复的最基本方法。
 

尼尔

论坛管理员
工作人员
已加入
2011年4月15日
留言内容
147
地点
VA
编程经验
10+
我将Web api方法用于我的测试系统,该方法每隔一段时间就会检查一次该方法,以检查是否返回结果。我有一个.NET解决方案,它每5分钟测试一次各种WCF服务和Web API。我使用了一个名为 入侵 用于测试服务并且还可以发出Web请求的服务器。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
关于JM说的话。这将是测试与服务器的连接的最有效方法。

想一想。如果服务器关闭,如何连接到服务器API?因此,使用诸如 平班, 或者 CMD 作为一个 可以在对服务器进行ping操作时以静默方式执行该操作?

你可以阅读我的 @跳伞 的多种代码变体,并详细讨论了如何在以下线程上执行此操作: 我的GUI平时无法打开Cmd-C#梦想中的代码
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
另外,我强烈建议您实际尝试访问WebAPI来确定它是启动还是关闭。 ping不足够。托管Web服务器的计算机可能已启动并正在运行,并且对ping作出响应,但是Web服务器(可能是IIS,Apache,node.js,Tomcat,JBoss等)可能没有运行。
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
194
编程经验
10+
谢谢 @跳伞 。这是我检查第三方API之一的方法。如果调用API时出现错误,我将仅添加发送电子邮件机制。

C#:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

namespace TestGameProduct
{
    internal class Program
    {
        private static readonly HttpClient httpc = new HttpClient();

        static async Task Main(string[] args)
        {
            FormUrlEncodedContent content = null;

            var productsDto = new ProductRequestDto();

            var applicationCode = "52e7cf9abc";
            var secretKey = "e560111000101";
            var version = "V1";
            string source = applicationCode + version + secretKey;

            using (var md5Hash = MD5.Create())
            {
                var hash = GetMd5Hash(md5Hash, source);
                productsDto.signature = hash;
                productsDto.ApplicationCode = applicationCode;
                productsDto.version = version;
            }

            //Convert request
            var keyValues = productsDto.ToKeyValues();
            content = new FormUrlEncodedContent(keyValues);

            await RunWithoutUsingHttpClient(content);
        }

        
        private static async Task RunWithoutUsingHttpClient(FormUrlEncodedContent content)
        {
            httpc.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue("Basic", "QklNOlFqSjQ1R1");
            
            for (int x = 0; x < 5000; x++)
            {
                HttpResponseMessage message = await httpc.PostAsync("http://test.com/test/Product/", content);
                Console.WriteLine(message.StatusCode);
            }
            Console.WriteLine("Connections Established");
            Console.ReadLine();
        }

        
        public static string GetMd5Hash(HashAlgorithm md5Hash, string input)
        {
            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }


    }

    public static class ObjectExtension
    {
        public static IDictionary<string, string> ToKeyValues(this object metaToken)
        {
            if (metaToken == null)
            {
                return null;
            }

            JToken token = metaToken as JToken;
            if (token == null)
            {
                return ToKeyValues(JObject.FromObject(metaToken));
            }

            if (token.HasValues)
            {
                var contentData = new Dictionary<string, string>();

                foreach (var child in token.Children().ToList())
                {
                    var childContent = child.ToKeyValues();
                    if (childContent != null)
                    {
                        contentData = contentData.Concat(childContent).ToDictionary(k => k.Key, v => v.Value);
                    }
                }

                return contentData;
            }

            var jValue = token as JValue;
            if (jValue?.Value == null)
            {
                return null;
            }

            var value = jValue?.Type == JTokenType.Date
                ? jValue?.ToString("o", CultureInfo.InvariantCulture)
                : jValue?.ToString(CultureInfo.InvariantCulture);

            return new Dictionary<string, string> { { token.Path, value } };
        }
    }
    public class ProductRequestDto
    {
        public string version { get; set; }
        public string signature { get; set; }
        public string ApplicationCode { get; set; }
    }


}
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
我强烈建议您实际尝试访问WebAPI来确定它是启动还是关闭。 ping不足够。
我不同意。如果服务器没有响应,如何访问API?如果服务器未响应ping,则服务器将不响应API调用。第一步是在API没有响应时对服务器执行ping操作。显然,如果ping通,则可能需要重新启动API依赖的服务。说ping并不足够,这不仅轻描淡写,而且还向那些与网络合作以度过一生中最好的人表示屈服。您如何访问API以检查服务器是否对传入连接没有响应?我想你有权发表自己的意见。
 

尼尔

论坛管理员
工作人员
已加入
2011年4月15日
留言内容
147
地点
VA
编程经验
10+
IIS网站回复ping是一回事,而检查发布和编译是否正常以及应用程序是否正在回答则是另一回事。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
在那个音符上;如果服务器没有响应传入的请求,则无法确定API是否正在运行。 ping是要运行的一系列测试中的第一个。

如果您知道API没有响应。对服务器执行ping操作并获得200响应将表明您的问题出在API上,可能是时候重新启动某些服务或检查负载平衡设置了。

您正在寻找回应200 Web API 2中的操作结果-ASP.NET 4.x =>看一下界面

您还可以在这里找到状态: HTTP / 1.1:状态代码定义
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
我以为你说的时候"ping"你在说 ICMP ping。这就是我刚才所说的不足。

根据您对第11条帖子的回复,看来您的"ping"实际上是一个HTTP请求。 (我从未听说过ICMP ping会给出200响应。)这就是我实际调用WebAPI的意思。您希望从正在调用的实际Web服务中获得响应,而不仅仅是从托管Web服务的服务器中获得ICMP ping响应。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
我以为你说的时候"ping"你在说 ICMP ping.
我曾是。这是发出http get请求后我将执行的最后一个方法。如果API没有响应,那么您需要确定您的API确实是问题所在,并且可以通过使用上面链接的方法对托管API的服务器执行ping操作。如果您的服务器分别响应ping,则可以安全地假设您的服务器可能存在负载平衡问题或其他导致其无法响应的问题。这就是为什么我说:
ping是要运行的一系列测试中的第一个。
...详细说明...在发出http请求之后。我仍然认为ping是区分这种情况下问题仍然存在的一种有价值的方法。
在帖子#11上,您似乎"ping"实际上是一个HTTP请求。
不,对不起,您那样看错了。我可能应该花更多的精力来解释我的意思,但是在YouTube上的所有漫长工作时间以及我的主要工作和个人合同,令我头昏脑沉,这几天我睡不着觉。尽管如此,我认为阅读此书的人会知道我的意思,因为如果您无法从Web服务器API获得响应,则检查服务器IP的唯一常识是。既然我已经更好地解释了,我仍然坚持我所说的。
 
最佳 底部