当前位置: 首页 > 知识库问答 >
问题:

使用HttpClient发布自定义类型

锺离宸
2023-03-14

我有一个自定义dto类:

public class myObject
{
    public string Id { get; set; }
    public string Name { get; set; }
}

和一个使用Web Api(4.5. net框架)的控制

[HttpPost]
public IHttpActionResult StripArchiveMailboxPermissions(myObject param)
{
    DoSomething(param);
    return OK();
}

客户端只有4.0.net框架,因此我将无法使用PostAsJsonAsync()方法。将对象从客户端传递到服务器的解决方案是什么?

我尝试了如下方法:

var response = Client.SendAsync(new HttpRequestMessage<myObject>(objectTest)).Result;

然而它给了我一个例外:

Could not load file or assembly 'Microsoft.Json, Version=2.0.0.0, 
Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. 
The system cannot find the file specified.

难道不能使用牛顿软件库吗?

共有2个答案

司空劲
2023-03-14

创建一个从 HttpContent 继承的类,该类为您提供了网络流,您可以直接写入该类,而无需使用 memoryStream

大概是这样的:

using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace Http.Helper.Extensions
{
    public class JsonHttpContentSerializer : HttpContent
    {

        private object Value { get; set; }

        public JsonHttpContentSerializer(Object value)
        {
            this.Value = value;
        }


        protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context)
        {
            using (var streamWriter = new StreamWriter(stream, new UTF8Encoding(false), 1024, true))
            {
                using (var jsonTextWriter = new JsonTextWriter(streamWriter) { Formatting = Formatting.None })
                {
                    var jsonSerializer = new JsonSerializer();
                    jsonSerializer.Serialize(jsonTextWriter, Value);
                    jsonTextWriter.Flush();
                }
            }

        }

        protected override bool TryComputeLength(out long length)
        {
            length = -1;
            return false;
        }

    }
}

你会用喜欢它

var jsonSerializeContent = new JsonHttpContentSerializer(someContent);
httpRequestMessage.Content = jsonSerializeContent;
杜阳炎
2023-03-14

当然。只需为自己创建一个像这样的新HttpContent类...

  public class JsonContent : HttpContent
    {

        private readonly MemoryStream _Stream = new MemoryStream();

        public JsonContent(object value)
        {

            var jw = new JsonTextWriter(new StreamWriter(_Stream)) {Formatting = Formatting.Indented};
            var serializer = new JsonSerializer();
            serializer.Serialize(jw, value);
            jw.Flush();
            _Stream.Position = 0;

        }
        protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
        {
            _Stream.CopyTo(stream);
            var tcs = new TaskCompletionSource<object>();
            tcs.SetResult(null);
            return tcs.Task;
        }

        protected override bool TryComputeLength(out long length)
        {
            length = _Stream.Length;
            return true;
        }
    }

现在,您可以将对象作为Json发送,如下所示

  var content = new JsonContent(new YourObject());
  var httpClient = new HttpClient();
  var response = httpClient.PostAsync("http://example.org/somewhere", content);
 类似资料:
  • 我已经构建了一个定制的gradle插件,我正试图将其发布到一个私有的maven repo。我使用插件来实现这一点。在经历了很多麻烦之后,我查看了google play services插件的实现(https://github.com/google/play-services-plugins/blob/master/google-services-plugin/publish.gradle)并试图复

  • 主要内容:Maven依赖关系,自定义HTTP头示例HTTP消息可以包含许多描述消息属性的标头,例如内容长度,内容类型,授权等。 HttpClient提供了检索,添加,删除和枚举标头的方法。 在下面的教程中,我们将演示如何将自定义HTTP头添加到HttpClient和Http请求方法。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache HttpClient 4.5版本。 将以下依赖项添加到您的项目中。 pom.xml 文件的

  • 我想为wordpress构建一个简单的票证系统插件。因此,我需要一个自定义的帖子类型。但是,如果保存了此帖子类型,则其帖子状态应仅为“发布”。因此,用于发布的整个默认元框都有不必要的字段。我不想要post状态下拉列表,也不想要visiblity设置字段。奇怪的是,即使我在register_post_type的参数中将属性public设置为false,也会显示此字段。 据我所知,自定义post类型的

  • 我有一个gradle构建脚本,它检索了一些常见的依赖项,并将它们组合起来创建了一个“胖罐子”。

  • 有没有办法使用自定义Chrome标签页发送带有网址的帖子数据?就像使用网络视图一样: 在留档或示例中找不到任何相关信息。

  • 本章节中,简述自定义类的创建和使用方法,供参考。 创建自定义类 用户可以定义自己的类,通过继承 ThingJS 内部类(比如:Thing 类),对 ThingJS 进行扩展和封装。 我们推荐使用 ES6 语法定义一个类。例如,自定义汽车类 Car。 // 继承 Thing 类 class Car extends THING.Thing { constructor(app) { super(