Как отправить camelCase Json в C# Web Api для сопоставления свойств Pascal с ошибкой

В настоящее время я использую этот JsonFormatter для отправки клиенту данных на верблюде

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver =
                new CamelCasePropertyNamesContractResolver();

WebApiConfig

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System.Web.Http;


namespace AlumCloud
{
    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: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            ((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;


            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver =
            new CamelCasePropertyNamesContractResolver();
        }
    }
}

Все работает отлично, мои данные получены на клиенте, как и ожидалось отлично.

Теперь пришло время начать отправку данных на сервер, и я использую

C# Web Api in the .NET platform.

Вот функция POST, в которую я пытаюсь отправить данные JSON Cased верблюда с одним объектом C#, для ясности я удалил большую часть кода.

Контроллер WebApi

namespace AlumCloud.Controllers
{
    [Authorize]
    public class HorizontalController : AlumCloudWebApiBaseController
    {
        public async Task<HttpResponseMessage> Post(Horizontal h)
        {
            string update = HttpContext.Current.Request.QueryString["a"];
            int ownerID = 0; ;
            HttpResponseMessage res = null;
            InsertHorizontalHelper insertRes = null;

            if (!int.TryParse(HttpContext.Current.Request.QueryString["id"], out ownerID))
            {
                return Request.CreateResponse(HttpStatusCode.NotFound, "Provide the id of the horizontal owner");
            };

            if (h.CompID < 1)
            {
                if (h.Sitelines.TopCompID > 0)
                {
                    h.CompID = h.Sitelines.TopCompID;
                };
            }
            switch (update)
            {

Вот как выглядят Свойства Горизонтального объекта, они в Паскале.

C# Customer Object Я хочу отобразить свойства из JSON в C#

namespace CADDL.DataTransfer.Tables
{

    [XmlType(Namespace = "urn:DataObjects")]
    [XmlRoot(Namespace = "urn:DataObjects")]
    [Serializable]
    public class Horizontal : ColumnInfo, IHorizontal
    {


        [ColumnAttributes("ID", false, "int")]
        public int ID { get; set; }
        [ColumnAttributes("Position", false, "byte")]
        public byte Position { get; set; }
        [ColumnAttributes("Name", false, "string")]
        public string Name { get; set; }
        [ColumnAttributes("IsFiller", false, "bool")]
        public bool IsFiller { get; set; }
        [ColumnAttributes("HorizontalNote", false, "string")]
        public string HorizontalNote { get; set; }
        [ColumnAttributes("SizeID", false, "int")]
        public int SizeID { get; set; }
        [ColumnAttributes("WidthInches", false, "decimal")]
        public decimal WidthInches { get; set; }
        [ColumnAttributes("HeightInches", false, "decimal")]

Моя ошибка

{"message":"An error has occurred.","exceptionMessage":"Object reference not set to an instance of an object.","exceptionType":"System.NullReferenceException","stackTrace":"   at AlumCloud.Controllers.HorizontalController.<Post>d__0.MoveNext() in D:\\Users\\Erik Little\\Documents\\visual studio 2015\\Projects\\AlumCloud\\AlumCloud\\Controllers\\CAD\\HorizontalController.cs:line 28\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__3`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"}

Мои вопросы к группе.

  1. Почему мой объект Horizontal C# всегда имеет значение null? Это потому, что JSON является верблюжьим, а свойства, которым он соответствует, - это паскаль?
  2. Должен ли преобразователь свойств из JSON в объект C# быть в одном и том же случае, чтобы установить значение?
  3. Какой глобальный способ исправить эту проблему, чтобы мне не нужно было добавлять настройки, устанавливаются в каждом новом контроллере Web Api?

Просто для ясности, атрибуты, которые вы видите в каждом свойстве, относятся к моему слою данных, поскольку при запросе данных они не используются в этом случае.

1 ответ

То, как объекты принимаются клиентом и обрабатываются на сервере, требует двух разных объектов, чтобы упростить жизнь, поэтому я создал папку с именем client request и, таким образом, нет конфликтов имен, с которыми я назвал класс Horizontal размер клиента HorizontalRequest, но с только свойствами, необходимыми для удовлетворения клиентов.

Объекты класса на сервере несколько больше, чем нужно для получения запроса JSON, поэтому, когда клиенты отправляют данные, когда объекты сервера в 20 раз больше, чем нужно, я просто создаю классы, такие как HorizontalRequest, без косточек, без атрибутов. Просто свойства.

Другие вопросы по тегам