![](/img/trans.png)
[英]How to properly enable Anonymous Access in IIS 6.0 & consume an MVC Web API via c# console app?
[英]Httpclient consume web api via console app C#
我正在嘗試使用Httpclient通過控制台應用程序使用以下Web API。 我被困在如何傳遞參數中。 參數將作為命令行參數來。 這是我的Rest API
[HttpPost, Route("Test")]
public IHttpActionResult Test(bool sample = false)
{
return Ok();
}
參數進來這是作為命令行參數
/Parameters:sample=true.
這是我在控制台應用程序中解析參數的方式
static int Main(string[] args)
{
if (args.Length == 0)
{
Console.Error.WriteLine("No action provided.");
return -1;
}
foreach (string param in args)
{
switch (param.Substring(0, param.IndexOf(":")))
{
case "/Action":
action = param.Substring(param.IndexOf(":") + 1);
break;
case "/Parameters":
parameter = param.Substring(param.IndexOf(":") + 1);
break;
}
}
return 0;
}
一旦我得到了這種格式的參數
參數=“ sample = true”
我正在嘗試調用網絡api調用,但無法傳遞參數值。 任何人都可以指出我在做什么錯
client.BaseAddress = new Uri(ConfigurationManager.AppSettings.Get("BaseWebApiUrl"));
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var apiUrl = GetApiURL();
var Context = new StringContent(JsonConvert.SerializeObject(parameter), Encoding.UTF8, "application/json");
var respFeed = await client.PostAsync(apiUrl, Context);
您應該將其作為URL的一部分傳遞。
private void CallService(bool sample)
{
client.BaseAddress = new Uri(ConfigurationManager.AppSettings.Get("BaseWebApiUrl"));
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var apiUrl = $"http://yourserver:port/api/somecontroller/?sample={sample}";
var Context = new StringContent(JsonConvert.SerializeObject(parameter), Encoding.UTF8, "application/json");
var respFeed = await client.PostAsync(apiUrl, Context);
}
默認情況下,Web Api中的基本類型參數永遠不會綁定到請求的主體。
如果要強制將bool
參數與請求主體綁定,則需要使用FromBodyAttribute
裝飾它:
[HttpPost, Route("Test")]
public IHttpActionResult Test([FromBody] bool sample = false)
{
return Ok();
}
請注意 ,即使執行此操作,您的請求也不適用於Web Api。 必須以特定格式傳遞單個基本類型參數。 在您的情況下,您的請求正文必須為以下內容:
=true
更好的方法是將Action參數轉換為類:
public class TestModel
{
public bool Sample { get; set; }
}
[HttpPost, Route("Test")]
public IHttpActionResult Test(TestModel model)
{
return Ok();
}
這樣,您將能夠將Json對象作為請求正文發送,例如:
{
"sample": true
}
這是一個如何獲得這種結果的小例子:
var parameterDictionary = parameter.Split("=").ToDictionary(s => s[0], s => bool.Parse(s[1]));
var json = JsonConvert.SerializeObject(parameterDictionary);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var respFeed = await client.PostAsync(apiUrl, content);
首先,將您的方法簽名更改為
public IHttpActionResult Test([FromBody]bool sample = false)
因為原始類型是通過URL /查詢字符串而不是正文來解析的。 通過添加FromBody屬性,將強制其從正文中解析。
接下來,由於您說參數值為var parameter =“ sample = true” ;,所以將參數構造更改為
var jsonParam = new { sample = parameter.split('=')[1]}; // I'm leaving null checks and validation for simplicity
var Context = new StringContent(JsonConvert.SerializeObject(jsonParam), Encoding.UTF8, "application/json");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.