You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C#调用ServiceNow POST API发送事件时遇WaitingForActivation问题求助

问题分析与解决建议

问题现象

调用C#代码向ServiceNow事件队列发送信息时,收到如下提示:

Id = 3, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}".

代码问题排查

原代码存在多个关键问题:

  • 异步方法未等待:client.PostAsync是异步方法,直接调用会返回未完成的Task,这就是WaitingForActivation状态的直接原因——任务还没执行就被丢弃。
  • JSON格式错误+重复序列化:手动拼接的JSON字符串里additional_info用了单引号(JSON规范要求双引号),且已经是JSON字符串的情况下,又用JavaScriptSerializer.Serialize再次序列化,最终发送的是转义后的无效JSON结构。
  • 请求地址错误:ServiceNow的/api/global/em/jsonv2本身就是提交事件的接口,追加"test"路径会导致404错误。
  • 缺少身份验证:ServiceNow接口需要Basic Auth或其他认证方式,原代码未添加认证头,会被拒绝访问。
  • HttpClient滥用:每次调用新建HttpClient实例会导致连接泄漏,应该复用单例实例。

修正后的代码

// 声明单例HttpClient,避免连接泄漏
private static readonly HttpClient _httpClient = new HttpClient();

public async Task PostEventAsync()     
{            
    // 用匿名对象构建数据,规避手动拼接JSON的格式错误
    var eventData = new 
    {
        records = new[] 
        {
            new 
            {
                source = "Test",
                event_class = "Test Class",
                node = "test",
                message_key = "Test Incident for Test 1",
                severity = "5",
                description = "Test Incident for Test 1 Desc",
                additional_info = new 
                {
                    name = "Test System",
                    short_des = "Test Incident for Test 1 Short Desc",
                    ASSIGNMENT_GROUP = "xyz"
                }
            }
        }
    };

    _httpClient.BaseAddress = new Uri("https://abcdev.service-now.com/");
    _httpClient.DefaultRequestHeaders.Clear();
    
    // 添加Basic Auth认证,替换为你的ServiceNow账号密码
    var authToken = Convert.ToBase64String(Encoding.ASCII.GetBytes("username:password"));
    _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authToken);

    // 序列化匿名对象为标准JSON
    var jsonBody = new JavaScriptSerializer().Serialize(eventData);
    var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

    // 等待异步请求完成,获取响应
    var response = await _httpClient.PostAsync("api/global/em/jsonv2", content);
    
    // 可选:校验响应状态,处理返回结果
    response.EnsureSuccessStatusCode();
    var responseContent = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseContent);
}

额外注意事项

  • 替换代码中的username和password为你的ServiceNow有效账号,也可根据实例要求改用OAuth认证。
  • 始终用对象构建数据再序列化,避免手动拼接JSON,减少格式错误。
  • 异步方法遵循Async后缀命名规范,调用方必须用await等待执行完成。

内容的提问来源于stack exchange,提问作者Govardhana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:01:08