【发布时间】:2021-11-26 04:16:38
【问题描述】:
我有一个非常简单的系统:托管在 domain.ru 上的 ASP .NET Core 服务器。在 API 控制器中,我有 2 种方法:
[HttpGet("{id}")]
public string Get(int id)
{
try
{
using (FileStream fstream = new FileStream(string.Format(@"{0}\data{1}.txt", _path, id.ToString()), FileMode.OpenOrCreate))
{
byte[] array = System.Text.Encoding.Default.GetBytes(id.ToString());
fstream.Write(array, 0, array.Length);
return "It's ok!";
}
}
catch
{
return "Something went wrong";
}
}
[HttpPost]
public string Post(string resolvedString)
{
try
{
using (FileStream fstream = new FileStream(string.Format(@"{0}\dataPost.txt", _path), FileMode.OpenOrCreate))
{
byte[] array = System.Text.Encoding.Default.GetBytes(resolvedString);
fstream.Write(array, 0, array.Length);
return "It's ok!";
}
}
catch
{
return "Something went wrong";
}
}
所以基本上他们都只是在 _path 目录中创建文本文件。我无法理解的部分是当我尝试通过 url domain.ru/api/values/1 调用 Get 方法时,我可以看到在 _path中创建的文件> 目录,我有响应“没关系!”。这就是我所说的Get:
var client = new HttpClient();
client.BaseAddress = new Uri(uri);
HttpResponseMessage response = await client.GetAsync("api/values/1");
string result = await response.Content.ReadAsStringAsync();
textBox1.Text = result.ToString();
但是当我对 Post 进行相同尝试时,我使用 C# 执行此操作时会收到错误请求,或者当我使用 Postman 执行此操作时会收到“出现问题”。 我就是这样称呼 Post 的
var client = new HttpClient();
client.BaseAddress = new Uri(uri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
MultipartFormDataContent content = new MultipartFormDataContent();
StringContent str = new StringContent("1");
content.Add(str);
HttpResponseMessage response = await client.PostAsync("api/values/", content);
string returnString = await response.Content.ReadAsStringAsync();
MessageBox.Show(returnString);
Here's what the request shows when I try to manually debug this
还有最有趣的部分。当我的服务器托管在 IIS(本地服务器)上时,当我尝试执行所有相同的操作时,它工作得很好!我真的不知道我做错了什么。请帮忙。
UPD。感谢 Jonathan,我要求我的托管商禁用 Plesk 中的 ModSecurity,并且在将 [HttpPost] 替换为 [HttpPost("{resolvedString}")] 后,上述代码开始工作。到目前为止一切顺利!
然后我尝试将 zip 存档发送到服务器。这是服务器的控制器代码:
[HttpPost]
public string ImportZip(IFormFile file)
{
DirectoryInfo dirInfo = new DirectoryInfo(_extractPath);
try
{
foreach (FileInfo myfile in dirInfo.GetFiles())
{
myfile.Delete();
}
string path = _path + "tmp.zip";
if (Request.HasFormContentType)
{
var form = Request.Form;
foreach (var formFile in form.Files)
{
using (var fileStream = new FileStream(path, FileMode.Create))
{
formFile.CopyTo(fileStream);
}
ZipFile.ExtractToDirectory(_path + "tmp.zip", _extractPath);
}
}
return "It's OK! At least we've entered the method.";
}
catch
{
return "Oh no no no...";
}
}
这就是我从客户端调用它的方式:
string filepath = _zipFile;
string filename = _fileName;
var client = new HttpClient();
client.BaseAddress = new Uri(uri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
MultipartFormDataContent content = new MultipartFormDataContent();
ByteArrayContent fileContent = new ByteArrayContent(File.ReadAllBytes(filepath));
content.Add(fileContent, "file", filename);
HttpResponseMessage response = await client.PostAsync("File/ImportZip/", content);
string result = await response.Content.ReadAsStringAsync();
textBox1.Text = result;
再一次,当我在我的计算机上同时运行服务器和客户端时,它可以正常工作。我可以在目标目录中看到下载的存档和提取的文件。 但是当我将我的服务器上传到主机并尝试再次执行我的查询时,我得到了同样的错误: an example of an error
【问题讨论】:
-
Plesk modsecurity 是否阻止了帖子?见:plesk.com/blog/various/modsecurity-comprehensive-guide
-
去掉 try/catch 和 try8 调试,因为你会在 Visual Studio 中得到异常。
-
@AliK,我的代码在托管时无法调试。
-
@Jonathan,谢谢,它适用于一个案例。但它要么不能正常工作,要么我犯了一些我看不到的愚蠢错误。
-
嗯,您发布的唯一错误表明您的请求遇到了 Plesk 安全问题。您还遇到了哪些其他错误?
标签: c# asp.net post asp.net-web-api get