我有一个让我发疯的问题。我使用RestSharp在WebAPI2上成功构建了几个休息服务和客户端。突然之间,即使是最简单的程序(见下文)也无法工作。我目前正在尝试显式使用Newtonsoft.JSON来序列化和反序列化。我安装了Json库的7.0.2版,它似乎取代了VS2015中MS提供的版本6。我包括下面的所有代码。请注意,服务器似乎工作正常,正如Fiddler验证的那样。我注意到当我开始使用Newtonsoft库时,它在所有'"''以前没有发生过。然而,结果是相同的 - 它错误地指示比指示的" Content-Length"更多的1个字符的问题。
注意:我对C#相当新,但在C / C ++上有25年以上的经验;我确信这是我想念的愚蠢,但我现在已经追了大约3个晚上而没有任何运气。提前谢谢!
WebAPI2配置:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace webapi2_server
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}",
defaults: new { }
);
}
}
}
WebAPI2控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Newtonsoft.Json;
public class my_data
{
public string sdata { get; set; }
public int idata { get; set; }
}
namespace webapi2_server.Controllers
{
public class TestController : ApiController
{
public HttpResponseMessage Get(HttpRequestMessage request)
{
HttpResponseMessage response;
List<my_data> myTestData = new List<my_data>();
myTestData.Add(new my_data() { sdata = "string1", idata = 1 });
myTestData.Add(new my_data() { sdata = "string2", idata = 2 });
myTestData.Add(new my_data() { sdata = "string3", idata = 3 });
string json = JsonConvert.SerializeObject(myTestData, Formatting.Indented);
return response = request.CreateResponse(HttpStatusCode.OK, json);
}
}
}
客户端软件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using RestSharp;
public class my_data
{
public string sdata { get; set; }
public int idata { get; set; }
}
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
RestClient client = new RestClient();
client.BaseUrl = new Uri("Http://192.168.0.6");
var request = new RestRequest();
request.Resource = "test/test";
request.Method = Method.GET;
request.RequestFormat = DataFormat.Json;
List<my_data> my_data_response = new List<my_data>();
IRestResponse<List<my_data>> response = client.Execute<List<my_data>>(request);
my_data_response = JsonConvert.DeserializeObject<List<my_data>>(response.Content);
System.Console.WriteLine("Response String: " + response.Content);
System.Console.WriteLine("Item Count: " + my_data_response.Count() );
}
}
}
运行客户端的输出:
未处理的异常:Newtonsoft.Json.JsonSerializationException:转换值&#34时出错; [
{
&#34; sdata&#34;:&#34; string1&#34;,
&#34; idata&#34;:1
},
{
&#34; sdata&#34;:&#34; string2&#34;,
&#34; idata&#34;:2
},
{
&#34; sdata&#34;:&#34; string3&#34;,
&#34; idata&#34;:3
}
]&#34;键入&#39; System.Collections.Generic.List 1[my_data]'. Path '', line 1, position 205. ---> System.ArgumentException: Could not cast or convert from System.String to System.Collections.Generic.List
1 [my_data]。
at Newtonsoft.Json.Utilities.ConvertUtils.EnsureTypeAssignable(Object value,Type initialType,Type targetType)
at Newtonsoft.Json.Utilities.ConvertUtils.ConvertOrCast(Object initialValue,CultureInfo culture,Type targetType)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader,Object value,CultureInfo culture,JsonContract contract,Type targetType)
---内部异常堆栈跟踪结束--- enter code here
答案 0 :(得分:0)
嗯,我现在通过简单地不使用Newtonsoft.Json而只使用MS的东西,它没有进行转义。但是,我也遇到过这个问题,这就是我尝试使用JSOFT开始的原因。我看到MS序列化与List&lt;&gt; ...
有问题的评论对我来说没有意义 - 我想如果我使用Newtonsoft进行序列化和反序列化,它应该可以工作......
当我回到现实世界的问题时,不确定这是否会起作用,但我会看到会发生什么。如果有人发现发布的问题,请告诉我。谢谢!