RESTful webservice +JSON+SQL 存储过程项目的问题

2024-01-02

我知道我确实想念一些东西。我的整个项目在某种程度上是各种“如何...”的复制和粘贴,我的 C# 知识充其量只是基础知识,我需要让它工作,因为我们的标准 Web 服务软件仅在发送时才是 RESTful。

我的主要问题是,我偶然发现的所有解决方案实际上都是代码片段,这对我来说不起作用 - 我的 C# 知识很基础,所以我不明白它是如何工作的,更不用说对其进行故障排除了。我很确定我什至没有捕获随传入请求一起发布的 JSON。但我可能错了。

要求:在 WS2012R2 上的 IIS 上运行的东西,可以通过 HTTPPost 接受 JSON 文件,将内容转储到 SQL Server 表中,并将刚刚创建的行的 Id 返回给 JSON 的发送者。我必须在它的基础上进行构建才能获得成熟的 Web 服务,该服务可以发送和接收包含不同数据的多个 JSON 文件,所有这些文件都必须最终存储在 SQL Server 中。

我拥有的:

Class:

    namespace NA.Models
{
    public class Note
    {
        public Note() { }

        //public Guid id { get; set; }
        public static string Client { get; set; }
        public static int Case { get; set; }
        public static string Text { get; set; }
        public static int NoteId { get; set; }
        public static string R1 { get; set; }
        public static string R2 { get; set; }
        public static string S1 { get; set; }
        public static DateTime Date { get; set; }
        public static bool Type { get; set; }
      }
    }

界面:

    namespace NA.Models
{
    interface INoteRepository
    {
        IEnumerable<Note> GetAll();
        void Add(Note item);
    }
}

存储库:

namespace NA.Models
{
  class NoteDataRepository : INoteRepository
  {
     public void Add(Note item)
     {
        if (item == null)
        {
            throw new ArgumentNullException("item");
        }
        else
        {
            String strConnString = ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
            SqlConnection con = new SqlConnection(strConnString);
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "BL_IntegrationInsertNote";
            cmd.Parameters.Add("@Client", SqlDbType.VarChar).Value = item.Client.Trim();
            cmd.Parameters.Add("@Case", SqlDbType.VarChar).Value = item.case;
            cmd.Parameters.Add("@Text", SqlDbType.VarChar).Value = item.Text.Trim();
            cmd.Parameters.Add("@When", SqlDbType.DateTime).Value = item.Date;
            cmd.Parameters.Add("@Ext", SqlDbType.Bit).Value = item.Type;
            cmd.Parameters.Add("@return", SqlDbType.Int).Direction = ParameterDirection.Output;
            cmd.Connection = con;

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                string id = cmd.Parameters["@return"].Value.ToString();
                string lblMessage = null;
                lblMessage = "Record inserted successfully. ID = " + id;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
                con.Dispose();
            }
        }    
        return item;
    }

    IEnumerable<Note> INoteRepository.GetAll()
    {
        throw new NotImplementedException("getitems");
    }
}
}

控制器:

namespace NA.Controllers
{
   public class NC : ApiController
   {
      [Route("AddNote")]
      [HttpPost]
    public HttpResponseMessage PostNote(List<Note> item)
    {
        //NoteJson deserializednote = JsonConvert.DeserializeObject<NoteJson>(item);
        //Note notesdata = new Note(item);
        //foreach (deserializednote   
        NotesAccept.Models.INoteRepository Repository = new NotesAccept.Models.NoteDataRepository();
        item = Repository.Add(item);
        var response = Request.CreateResponse < NotesAccept.Models.Note>(HttpStatusCode.Created, item);

        return response;
    }
   }
}

当尝试将测试 json 发送到服务时,我收到错误返回:

500:服务器内部错误,参数项的值不能为空

这是 posttestserver.com 发送的请求的转储:

Headers (Some may be inserted by server)
REQUEST_URI = /post.php
QUERY_STRING = 
REQUEST_METHOD = POST
GATEWAY_INTERFACE = CGI/1.1
REMOTE_PORT = 56926
REMOTE_ADDR = ip
HTTP_CONNECTION = close
HTTP_CACHE_CONTROL = max-age=259200
HTTP_X_FORWARDED_FOR = 172.16.3.87
HTTP_VIA = 1.1 koenig.local (squid/3.3.13)
HTTP_EXPECT = 100-continue
CONTENT_LENGTH = 153
HTTP_HOST = posttestserver.com
HTTP_ACCEPT = application/json
CONTENT_TYPE = application/json
UNIQUE_ID = Vri0cUBaMGUAABvGeesAAAAL
REQUEST_TIME_FLOAT = 1454945393.4611
REQUEST_TIME = 1454945393

No Post Params.

== Begin post body ==
[{
    "Client": "Client1",
    "Case": 1,
    "Text": "Text",
    "NoteId": 2,
    "R1": "R1",
    "R2": "R2",
    "S1": "S1",
    "Date": "2015-10-26T09:06:46",
    "Type":"1"
}]
== End post body ==

Upload contains PUT data:
[{
    "Client": "Client1",
    "Case": 1,
    "Text": "Text",
    "NoteId": 2,
    "R1": "R1",
    "R2": "R2",
    "S1": "S1",
    "Date": "2015-10-26T09:06:46",
    "Type":"1"
}]

上面的转储来自 POST 请求,与我发送到 Web 服务的请求相同,但 URL 除外。所以可以视为实际请求。 这是 IIS 日志:

字段:日期时间 s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status 所用时间 2016-02-08 15:49:52 ::1 POST /blz/AddNote - 80 - ::1 - - 500 0 0 2937


好的,您需要更改几件事才能使其正常工作:

  1. 将无参数构造函数添加到 Note,因为反序列化需要它:

    public Note()
    {
    }
    
  2. 删除注释字段中的“static”:

    public static string Client { get; set; }

    public static int Case { get; set; }

    public static string Text { get; set; }

    public static int NoteId { get; set; }

    public static string R1 { get; set; }

    public static string R2 { get; set; }

    public static string S1 { get; set; }

    public static DateTime Date { get; set; }

    public static bool Type { get; set; }

  3. 如果您只想要 1 个对象,请不要发送 JSON 数组,它不会反序列化。您需要单个对象,而不是数组,因此不要发送数组。

  4. 您的类型为 bool,但您正在发送字符串“1”,这不会像您预期的那样反序列化为真值。发送 true/false(不是“true”/“false”)或将 Type 的类型更改为字符串。

  5. 去掉那个私有项目字段,你不需要它:

    private Note item;

  6. 摆脱那里的那些构造函数

    public Note(string json)

    public Note(Note item)

    它们不仅没有意义并且不起作用,而且您也不需要它们,因为 JSON 反序列化器会为您填充字段。

EDIT:例如,您说它不会构建,因为不再有带有一个参数的构造函数。当然不建,有这一行

Note notesdata = new Note(item);

但你不需要那条线。这条线背后的想法是什么?您想要一个 Note 类的实例,但您已经在“item”变量中拥有它。您不需要创建它的第二个副本。所以也摆脱这个。

它无法编译的另一个原因是您删除了这些静态字段,而您的 Add 方法中仍然有这些字段:

        cmd.Parameters.Add("@Text", SqlDbType.VarChar).Value = Note.Text.Trim();
        cmd.Parameters.Add("@When", SqlDbType.DateTime).Value = Note.Date;

我很确定你不希望这样。相反,您想要使用发送给您的对象的实例:

        cmd.Parameters.Add("@Text", SqlDbType.VarChar).Value = item.Text.Trim();
        cmd.Parameters.Add("@When", SqlDbType.DateTime).Value = item.Date;

另一件事是,Add 方法通常没有理由返回正在添加到数据库的对象。所以请随意更改此设置

   public Note Add(Note item)

to this

   public void Add(Note item)

并且不要返回任何东西,你不需要它。

我不是 SqlConnection 及其相关事物的专家,因此我不对这部分发表评论。我在项目中使用 EF 来处理 DB。所以这部分可能存在一些问题,但我无法对此发表评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RESTful webservice +JSON+SQL 存储过程项目的问题 的相关文章

  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 条件类型定义

    如果我有一小段这样的代码 template
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 使用facet_wrap显示多个直方图

    样本数据 df lt data frame id rep 1 6 each 50 x rnorm 50 6 mean 10 sd 5 y rnorm 50 6 mean 20 sd 10 z rnorm 50 6 mean 30 sd 15
  • 将 xtable 与 longtable 选项一起使用时重复标头

    在使用 longtable 选项生成 xtable 时 有没有办法重复顶行 设置标题 例如 如果我有 tableSb lt xtable df caption A Very Long Table label ALongTable print
  • 处理不是 Action 请求的 Multipart 请求?

    我一直在想是否可以处理不是操作请求的多部分请求 对我来说这似乎不可能是有原因的 只有 ActionRequest 实现 getFile 类方法 我不能 找到任何简单的方法来获取文件 出于除 Action 之外的请求 要求 如果我不使用 ht
  • 不在 UI 线程中触发 PropertyChanged 会产生哪些副作用?

    如果您实现 INotifyPropertyChanged 您可以在非 UI 线程中引发事件 我应该避免这种情况吗 为什么 Update 这是关于 wpf 应用程序中的绑定 不 你不应该避免这个 WPF 元帅PropertyChanged代表
  • 使用 XSL 封装 HTML 中的单词

    我需要在 HTML 文档中用标签 例如 span 包装每个单词 例如 div Text in a div div div Text in a div p Text inside a p p div 得到这样的结果 div span Text
  • 为了学习目的,Erlang 有哪些有趣的项目可以解决? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我最近发现了 Erlang 现在正在学习几个教程 到目前为止 我期待着将一些东西作为一个业余爱好项目来实际实施 我对另一个聊天服务器并不真正感兴
  • NetBeans 安装程序未正确找到 Java

    我正在尝试安装 NetBeans 全部 包 并且我很确定我已经安装了 Java SE 开发工具包 但是它没有正确定位它 它出现了错误 Java SE Development Kit JDK was not found on this com
  • 如何仅使用 javascript 将页面高度增加 X 像素

    假设一个 HTML 页面 html content outside of our control javascript block some more html content outside of our control 进一步假设我们能
  • Google 地方信息返回错误的城市

    我正在使用 google autocomplete Places API 构建一个应用程序 如果我对地址 Pongal New York NY United States 使用预测建议 我会在返回地点对象中得到以下项目 地区 曼哈顿 Adm
  • 如何将 numpy 数组转换为 mp3 文件

    我正在使用声卡库来记录我的麦克风输入 它记录在 NumPy 数组中 我想抓取该音频并将其保存为 mp3 文件 Code import soundcard as sc import numpy import threading speaker
  • 像 Exposé 中那样放置框

    有谁知道如何找到最适合特定区域的矩形 矩形可以放大到一定限度 但它们应该保持其比例 我基本上想重建 Mac OS 的 Expos Picture http switchtoamac com guides images expose all
  • 如何解决现有文件和符号链接之间的 npm install 冲突?

    我遇到了一个问题NPM https www npmjs com 它似乎正在检测具有相同名称的现有文件和符号链接之间的冲突 运行时我没有看到任何符号链接ls l从我的项目的根文件夹 我如何弄清楚 NPM 发生了什么并解决这个冲突 持续集成构建
  • 如何区分两棵树以确定父母的变化?

    我有一个树结构 需要重新排列 拖放 然后提交更改 捕捉变化的最佳方式是什么 据我所知 有两种方法 存储每个更改命令 提交更改列表 然后执行每个更改命令 序列化树 然后将新树与旧树进行比较以找出更改的内容 然后执行更改 1 似乎最容易实现 尽
  • 更新后 SQL Server 错误:提供给函数的令牌无效

    我正在使用我的机器 和 SSMS 一切正常 我重新启动后 Windows 10 应用了以下更新 Windows Malicious Software Removal Tool for Windows 8 8 1 10 and Windows
  • 在networkx中按权重对边缘进行着色

    我在这里只找到了与我想要的类似的东西 根据权重对网络边缘进行着色 https stackoverflow com questions 17632151 coloring networkx edges based on weight 但是我似
  • 在 PHP 中传递带有参数的回调

    我有一个 PHP 库函数 需要一个不带参数的回调 我知道我可以传递对象的方法array this my function name 但我怎样才能给参数my function name 我找到了一个解决方案 使用create function
  • gulp watch 立即终止

    我有一个非常小的 gulpfile 如下 注册了一个监视任务 var gulp require gulp var jshint require gulp jshint gulp task lint function gulp src app
  • AVAudioPlayer 和 AVAudioRecorder:未调用委托方法

    我的委托方法audioRecorderDidFinishRecording and audioPlayerDidFinishPlaying没有被调用 这些方法应该触发 stopanimation 方法 该方法在录制完成后停止动画 我已拨打电
  • 使用 UNREFERENCED_PARAMETER 宏

    我在 Visual Studio 上使用 W4 警告级别 并且正在编写 Windows 程序 int WINAPI WinMain HINSTANCE hInstance HINSTANCE hPrevInstance LPSTR lpCm
  • RESTful webservice +JSON+SQL 存储过程项目的问题

    我知道我确实想念一些东西 我的整个项目在某种程度上是各种 如何 的复制和粘贴 我的 C 知识充其量只是基础知识 我需要让它工作 因为我们的标准 Web 服务软件仅在发送时才是 RESTful 我的主要问题是 我偶然发现的所有解决方案实际上都