如何在POST Rest调用中将文件与自定义类一起放置?

How to put a file along with a custom class in a POST Rest call?

提问人:Wilkret 提问时间:5/24/2023 最后编辑:Wilkret 更新时间:5/24/2023 访问量:29

问:

我已经摸不着头脑一段时间了,我只是不知道如何使用 NLogger(Net4.7.5) 做到这一点

这个 HttpPost 请求的目的是它应该将一个 .stl 文件与 WebRequest 中的自定义类一起发送,最终我想要这样的东西: (https://i.stack.imgur.com/PyQk0.png)。

在 net6.0 中,据我所知,至少在 Web API 中,您可以很容易地使用 FileContentResult ControllerBase.File() 返回。但我还没有在net4.7.5中找到它的替代品。

这是我使用带有 NLogger 的 net4.7.5 所得到的

private static bool PingServer(string server, object seDocument)
{
    HttpWebRequest webRequest = WebRequest.CreateHttp($"http://{server}//stl");
    webRequest.Timeout = 5000; //Default is 100.000 (100 seconds)...
    webRequest.Method = WebRequestMethods.Http.Post;


    Byte[] stlFile = System.IO.File.ReadAllBytes($@"{listTempFiles[0]}");
    String base64String = Convert.ToBase64String(stlFile);

    //Note to future me, this doesn't need to be jsonified
    var json = JsonConvert.SerializeObject(seDocument);
    byte[] b = Encoding.UTF8.GetBytes(json);

    switch (System.IO.Path.GetExtension(listTempFiles[0]))
    {
        case ".stl":
        case ".STL":
            webRequest.ContentType = "application/sla";
            break;

        case ".jt":
        case ".JT":
            webRequest.ContentType = ".";
            break;

        default:
            webRequest.ContentType = "application/json";
            break;
    }
    webRequest.ContentLength = b.Length;

    using (var stream = webRequest.GetRequestStream())
    {
        stream.Write(b, 0, b.Length);
    }

    HttpWebResponse response;
    try
    {
        response = webRequest.GetResponse() as HttpWebResponse;
    }
    catch (Exception e)
    {
        LogManager.GetCurrentClassLogger().Info(e.Message);
        return false;
    }

    if (response != null)
    {
        LogManager.GetCurrentClassLogger()
        .Info($"'{server}' responded with status '{response.StatusCode.ToString()}'");
    }

    return response == null || response.StatusCode == HttpStatusCode.OK;
}

我在net6.0中使用带有HttpGet的WebApi做了类似的事情

[HttpGet("{mainpath}/{true}")]
public List<MendixFile> GetAll(string mainpath)
{
  List<MendixFile> mendixFiles = new List<MendixFile>();

  string[] files = Directory.GetFiles(mainpath, "*", searchOption: SearchOption.AllDirectories);
  foreach (string file in files)
    {
       Byte[] b = System.IO.File.ReadAllBytes($@"{file}");
       string path = Path.GetDirectoryName(file);
       string name= Path.GetFileName(file);
       MendixFile mendixFile = new MendixFile(path, name, b);
       File(b, "image/jpg");
       mendixFiles.Add(mendixFile);
    }
    return mendixFiles;
}

注意:我无法切换到其他框架,因为 net4.7.5 有一些我只能在 net4.7.5 中使用的强制库。

附加说明:默认情况下,listTempFiles[0] 始终为 C:/Temp/Part.stl

C# REST httpWebRequest nlog

评论

0赞 Menno van Lavieren 5/24/2023
您是否控制处理此 POST 请求的服务器端代码?如果 json 很小,您可以使用自定义标头,使用 HttpWebRequest.Headers.Add(string, string);
0赞 Wilkret 5/25/2023
看起来我想多了这个问题,我只需要让服务器将 base64String 解码为文件格式,而不是直接发送带有自定义附加属性的请求。对于给您带来的不便,我们深表歉意!

答: 暂无答案