You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web API调用PHP遇301永久重定向错误的原因排查

错误分析:Remote server returned an error (301) Moved Permanently

首先明确:IIS发布时启用预编译选项不会直接引发301重定向错误。预编译仅将ASP.NET项目编译为二进制文件以优化启动速度,与外部HTTP请求的重定向逻辑完全无关。

301错误的可能原因:

  • 目标PHP接口的URL配置/路径问题

    • 协议不匹配:目标服务器已强制HTTPS访问,但你的请求使用HTTP,服务器返回301跳转至HTTPS地址;
    • 路径拼写/大小写不符:若PHP部署在Linux服务器上,文件路径区分大小写(如代码中Backend_PHP实际为backend_php),服务器可能返回301跳转至正确路径;
    • 路径缺失斜杠:拼接后的URL末尾缺少必要斜杠(如xxx/project/Backend_PHP而非xxx/project/Backend_PHP/),服务器返回301补全路径;
    • 接口地址变更:目标PHP文件已迁移至新路径,服务器配置了301重定向指向新地址。
  • WebClient对POST重定向的处理限制
    WebClient默认AllowAutoRedirect = true,但根据HTTP规范,POST请求触发301重定向后,后续请求会转为GET方法。若目标接口仅接受POST请求,或重定向后的地址不支持GET,就会导致请求失败,甚至直接抛出301错误(部分场景下WebClient不会自动完成重定向流程)。

  • PHP服务器的重写/重定向规则
    Apache/Nginx等服务器配置了URL重写规则(如.htaccess或Nginx配置文件),将terp_api.php的请求重定向至其他地址,或因域名变更、站点迁移返回301。

排查与解决建议:

  1. 验证目标URL:用Postman、curl等工具直接发送POST请求到拼接后的URL,查看是否返回301,同时获取响应头中的Location字段,确认重定向的目标地址;
  2. 检查URL拼接逻辑:确认POCOBaseURL.Base_Urls的协议(HTTP/HTTPS)、末尾是否带斜杠,拼接后的完整路径是否与实际接口地址一致;
  3. 手动处理重定向:修改WebClient代码,禁用自动重定向,捕获301后手动使用新地址重新发送POST请求:
using (var client = new WebClient())
{
    client.AllowAutoRedirect = false;
    var values = new NameValueCollection();
    // 填充参数...
    values["user_id"] = User_Id;
    values["resource_id_org"] = "808";
    values["resource_id"] = "808";
    values["record_id"] = levid.ToString();
    values["action"] = "lr_waiting_for_hr_approval";
    values["process"] = "LeaveRequest";
    values["condition"] = con;

    if (con == "0")
    {
        values["assign_to"] = lev_form.CREATED_BY.ToString();
    }
    values["api"] = "1";

    try
    {
        var response = client.UploadValues(POCOBaseURL.Base_Urls + "project/Backend_PHP/terp_api.php", "POST", values);
        var responseString = Encoding.Default.GetString(response).Replace("\n", "").Replace("\r", "").Trim();
        // 处理正常响应逻辑
        if (responseString == " 1" || responseString == "1" || responseString[responseString.Length - 1].ToString() == "1")
        {
            // 原业务逻辑
        }
    }
    catch (WebException ex)
    {
        if (ex.Response is HttpWebResponse httpResponse && httpResponse.StatusCode == HttpStatusCode.MovedPermanently)
        {
            string newTargetUrl = httpResponse.Headers["Location"];
            // 用新地址重新发送POST请求
            var newResponse = client.UploadValues(newTargetUrl, "POST", values);
            var responseString = Encoding.Default.GetString(newResponse).Replace("\n", "").Replace("\r", "").Trim();
            // 处理重定向后的响应逻辑
            if (responseString == " 1" || responseString == "1" || responseString[responseString.Length - 1].ToString() == "1")
            {
                // 原业务逻辑
            }
        }
        else
        {
            throw;
        }
    }
}
  1. 查看PHP服务器日志:检查Apache/Nginx的访问日志和错误日志,确认301重定向的触发原因。

内容的提问来源于stack exchange,提问作者sid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:43:11