gpt4 book ai didi

asp.net-mvc - Request.Url.Scheme 未按预期工作

转载 作者:行者123 更新时间:2023-12-01 20:26:43 25 4
gpt4 key购买 nike

我正在使用 asp.net MVC。我的代码是:

var url = Url.Action(
"ConfirmEmail", "Account",
new { userId = id, code = code },
protocol: Request.Url.Scheme);

在本地主机上它返回正确的 url,即

https://localhost:44300/Account/ConfirmEmail?userId=bed34d05-2b7b-49b8-940e-0d89d4870d17&code=AQAA

但是在实时网站上它没有按预期工作。它返回的url是:

http://newtemp.apphb.com:16169/Account/ConfirmEmail?userId=7ba65316-0901-4c27-9371-588a5e945baa&code=AQAA

:16169 部分是附加的。它从哪里来以及如何删除它?

我的详细代码是:

public async Task<bool> SendMailtoConfirmEmailAddress(string id,string name,string email)
{
var user = await db.AspNetUsers.FindAsync(id);
if (user.EmailConfirmed)
{
return false;
}
try
{
var provider = new DpapiDataProtectionProvider("http://newtemp.apphb.com/");
UserManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser, string>(provider.Create("UserToken"))
as IUserTokenProvider<ApplicationUser, string>;

var code = await UserManager.GenerateEmailConfirmationTokenAsync(id);
var callbackUrl = Url.Action(
"ConfirmEmail", "Account",
new { userId = id, code = code },
protocol: Request.Url.Scheme);

ElectronicsController.sendEmail(email, "Welcome to dealkar.pk - Confirm Email address", "Hello " + name + "!<br/>Confirm your email address by clicking <a href=\"" + callbackUrl + "\">here</a> OR " + callbackUrl);

}
catch (Exception e)
{
string s = e.ToString();
}
return true;
}

最佳答案

Where it came from?

port is resolved from the current request 。不幸的是,Microsoft 没有考虑何时在运行非默认端口的服务器上生成 URL,并且它只会使用当前端口(无论协议(protocol)是否与当前请求相同)。

how to remove this?

您可以创建一个扩展方法来告诉 UrlHelper 使用默认端口,无论传入请求的端口如何。

此示例基于默认端口(HTTP 为 80,HTTPS 为 443)创建一个伪造的 HTTP 上下文,然后使用 UrlHelper 的新实例来解析 URL。

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

public static class UrlHelperExtensions
{
public static string Action(this UrlHelper helper, string actionName, string controllerName, object routeValues, string protocol, bool defaultPort)
{
return Action(helper, actionName, controllerName, routeValues, protocol, null, defaultPort);
}

public static string Action(this UrlHelper helper, string actionName, string controllerName, object routeValues, string protocol, string hostName, bool defaultPort)
{
if (!defaultPort)
{
return helper.Action(actionName, controllerName, new RouteValueDictionary(routeValues), protocol, hostName);
}

string port = "80";
if (protocol.Equals("https", StringComparison.OrdinalIgnoreCase))
{
port = "443";
}

Uri requestUrl = helper.RequestContext.HttpContext.Request.Url;
string defaultPortRequestUrl = Regex.Replace(requestUrl.ToString(), @"(?<=:)\d+?(?=/)", port);
Uri url = new Uri(new Uri(defaultPortRequestUrl, UriKind.Absolute), requestUrl.PathAndQuery);

var requestContext = GetRequestContext(url);
var urlHelper = new UrlHelper(requestContext, helper.RouteCollection);

var values = new RouteValueDictionary(routeValues);
values.Add("controller", controllerName);
values.Add("action", actionName);

return urlHelper.RouteUrl(null, values, protocol, hostName);
}

private static RequestContext GetRequestContext(Uri uri)
{
// Create a TextWriter with null stream as a backing stream
// which doesn't consume resources
using (var writer = new StreamWriter(Stream.Null))
{
var request = new HttpRequest(
filename: string.Empty,
url: uri.ToString(),
queryString: string.IsNullOrEmpty(uri.Query) ? string.Empty : uri.Query.Substring(1));
var response = new HttpResponse(writer);
var httpContext = new HttpContext(request, response);
var httpContextBase = new HttpContextWrapper(httpContext);
return new RequestContext(httpContextBase, new RouteData());
}
}
}

用法

        var url = Url.Action("ConfirmEmail", "Account",
new { userId = 123, code = 456 },
protocol: Request.Url.Scheme,
defaultPort: true);

关于asp.net-mvc - Request.Url.Scheme 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36263495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com