Previous responses didn't help me. My approach has been create an action in my Home controller with the same functionality that UrlHelper.
[HttpPost]
[Route("format-url")]
public ActionResult FormatUrl()
{
string action = null;
string controller = null;
string protocol = null;
dynamic parameters = null;
foreach (var key in this.Request.Form.AllKeys)
{
var value = this.Request.Form[key];
if (key.Similar("action"))
{
action = value;
}
else if (key.Similar("controller"))
{
controller = value;
}
else if (key.Similar("protocol"))
{
protocol = value;
}
else if (key.Similar("parameters"))
{
JObject jObject = JsonConvert.DeserializeObject<dynamic>(value);
var dict = new Dictionary<string, object>();
foreach (var item in jObject)
{
dict[item.Key] = item.Value;
}
parameters = AnonymousType.FromDictToAnonymousObj(dict);
}
}
if (string.IsNullOrEmpty(action))
{
return new ContentResult { Content = string.Empty };
}
int flag = 1;
if (!string.IsNullOrEmpty(controller))
{
flag |= 2;
}
if (!string.IsNullOrEmpty(protocol))
{
flag |= 4;
}
if (parameters != null)
{
flag |= 8;
}
var url = string.Empty;
switch (flag)
{
case 1: url = this.Url.Action(action); break;
case 3: url = this.Url.Action(action, controller); break;
case 7: url = this.Url.Action(action, controller, protocol); break;
case 9: url = this.Url.Action(action, parameters); break;
case 11: url = this.Url.Action(action, controller, parameters); break;
case 15: url = this.Url.Action(action, controller, parameters, protocol); break;
}
return new ContentResult { Content = url };
}
Been an action, you can request it from anywhere, even inside the Hub:
var postData = "action=your-action&controller=your-controller";
// Add, for example, an id parameter of type integer
var json = "{\"id\":3}";
postData += $"¶meters={json}";
var data = Encoding.ASCII.GetBytes(postData);
#if DEBUG
var url = $"https://localhost:44301/format-url";
#else
var url = $"https://your-domain-name/format-url";
#endif
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/text/plain";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var link = new StreamReader(stream: response.GetResponseStream()).ReadToEnd();
You can get source code of AnonymousType here.