C#HttpWebRequest到Scorm Cloud始终返回错误400错误请求

C#HttpWebRequest到Scorm Cloud始终返回错误400错误请求,c#,json,httpwebrequest,tin-can-api,C#,Json,Httpwebrequest,Tin Can Api,我试图通过JSON格式的c#HttpWebRequest将Tin Can语句发布到Scorm云LRS。然而,我总是得到错误400。身份验证是正确的,那么JSON有什么问题?我也尝试过用UTF8编码,但仍然没有成功 以下是所需的代码和凭据: HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://cloud.scorm.com/ScormEngineInterface/TCAPI/RCFZ5D8G

我试图通过JSON格式的c#HttpWebRequest将Tin Can语句发布到Scorm云LRS。然而,我总是得到错误400。身份验证是正确的,那么JSON有什么问题?我也尝试过用UTF8编码,但仍然没有成功

以下是所需的代码和凭据:

    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://cloud.scorm.com/ScormEngineInterface/TCAPI/RCFZ5D8GXU/sandbox/");
    httpWebRequest.ContentType = "application/json; charset=UTF-8";
    httpWebRequest.Method = "POST";
    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
    String autorization= "Basic " + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("RCFZ5D8GXU222" + ":" + "YQA3VfX1NiuYkKXEEzkKu723NwejpwNkB6x0Vhg3"));

    httpWebRequest.Headers.Add("Authorization", autorization);
    httpWebRequest.Headers.Add("X-Experience-API-Version", "1.0.1");
    string jsonText = "{"+
                        "   \"actor\": {"+
                            "   \"mbox\": \"mailto:Steeno@gmail.com\","+
                            "   \"name\": \"Austin Glatt\","+
                            "   \"objectType\": \"Agent\""+
                            "},"+
                            "\"verb\": {"+
                            "   \"id\": \"http://adlnet.gov/expapi/verbs/attempted\","+
                            "   \"display\": {"+
                            "       \"en-US\": \"attempted\""+
                            "   }"+
                            "},"+
                            "\"object\": {"+
                            "   \"id\": \"http://www.example.com/tincan/activities/cMjKwAGI\","+
                            "   \"objectType\": \"Activity\","+
                            "   \"definition\": {"+
                            "       \"name\": {"+
                            "           \"en-US\": \"Part Removal\""+
                            "       },"+
                            "       \"description\": {"+
                            "           \"en-US\": \"On Engine 155\""+
                            "       }"+
                            "   }"+
                            "}"+
                        "}";
    byte [] jsonData = System.Text.Encoding.UTF8.GetBytes(jsonText);
    Debug.Log(System.Text.Encoding.UTF8.GetString(jsonData));
    httpWebRequest.ContentLength = jsonData.Length;
    using (var streamWriter = httpWebRequest.GetRequestStream())
    {
        streamWriter.Write(jsonData,0,jsonData.Length);
        streamWriter.Flush();
        streamWriter.Close();
    }


     try
        {
            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
                Debug.Log("POST result"+result);
            }
    }
    catch(WebException ex)
    {

        if (ex.Response != null)
        {
            Debug.Log(ex.Message);
            foreach(DictionaryEntry d in ex.Data)
                Debug.Log(d.ToString());

                 string errorDetail = string.Empty;
                using (StreamReader streamReader = new StreamReader(ex.Response.GetResponseStream(), true))
                {
                    errorDetail = streamReader.ReadToEnd();
                    Debug.Log(errorDetail);
                }
        }
    }

我认为您缺少URL上的“声明”,您的请求应该是:

如果有人关心,原始答案如下:

看起来您发布的是0.95或1.0.x语句,但您似乎没有设置x-Experience-API-Version头,因此LRS可能将其解释为无效的0.9语句

我强烈建议使用库来构建请求以及请求的内容。我们这里有一个:


响应正文应告诉您LRS返回400状态代码的原因。如果您将此添加到您的问题中,我们可以更准确地给出答案。此外,您不应该在SO中发布身份验证凭据。我在下面提到了它,但400状态代码是由于url格式错误造成的。代码中的URL是正确的(语句生成器正好命中它),因此它必须是我感觉到的JSON。至于证书,这个LRS被扔掉了,一旦我解决了这个问题,它将不复存在。米勒就是我想联系的那个人!我确实尝试过在版本1.0.1中添加标题(我实际上使用了你们的GIT项目来查看你们做了什么,并寻找差异,但仍然不走运。我不能使用该库,因为我正在与Unity集成,并且希望它也能用于web player(出于安全原因,web player不要求使用.NET库)。此外,您的库依赖于包含同名.cs文件的JSON库,因此即使我直接在Unity项目中删除源代码,编译器也会抱怨多个同名脚本。仅供参考,我更新了代码以反映最新的尝试。我仍然收到错误400(错误的URL是罪魁祸首)。即使设置了最新的XAPI头字符串,它似乎仍然不喜欢我的JSON。我使用了tin can站点的语句生成器,并将其包装为字符串形式。请参阅更新的答案。必须在基本LRS URL上指定端点。