Je fais un HttpPost à un service de repos pour révoquer une licence. Sur Android, la demande fonctionne parfaitement. Mais en faisant le post en c #, j'obtiens la réponse

"Aucune action n'a été trouvée sur le contrôleur correspondant à la demande"

Sous Android:

@Override
protected String doInBackground(String... params) 
{
        String request = serverUrl + "api/Public/RemoveInstall?DeviceID="+deviceId+"&UserID="+m_userID;
        try {
            if(!isNetworkAvailable())
            {
                return "no_accesToken";
            }
            else
            {
                URL url = new URL(request);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(CONNECTION_TIMEOUT);
                conn.setDoOutput(false);
                conn.setInstanceFollowRedirects(false);
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.setRequestProperty("charset", "utf-8");
                conn.setConnectTimeout(1500);
                conn.setUseCaches(false);
                conn.connect();

                ...
}

Le code ci-dessus fonctionne parfaitement, mais en c # cela ne fonctionnera pas:

public async Task<bool> RevokeLicenseAsync(string userId)
{
        if (!IsInternetConnected())
        {
            errorMsg = "No internet connection";
            return false;
        }

        string deviceId = GetDeviceID();

        var postData = new List<KeyValuePair<string, string>>();
        postData.Add(new KeyValuePair<string, string>("DeviceID", deviceId));
        postData.Add(new KeyValuePair<string, string>("UserID", userId));

        //the header arguments "ContentType" and "ContentLength are filled in automatically"
        var formContent = new FormUrlEncodedContent(postData);

        if (!String.IsNullOrEmpty(token)) 
        {
            using (HttpClient httpClient = new HttpClient())
            {
                httpClient.BaseAddress = new Uri(serverUrl);

                using (var response = await httpClient.PostAsync("api/Public/RemoveInstall",formContent))
                {
2
DennisVA 5 avril 2017 à 14:21

2 réponses

Meilleure réponse

Dans la requête Android, vous publiez les paramètres dans l'url, mais dans la seconde, vous les publiez dans le corps.

Si le premier fonctionne, essayez de faire de même pour le second.

var requestUri = string.Format("api/Public/RemoveInstall?DeviceID={0}&UserID={1}", deviceId, userId);
var request = new HttpRequestMessage(HttpMethod.Post, requestUri);
using (var httpClient = new HttpClient()) {
    httpClient.BaseAddress = new Uri(serverUrl);
    using (var response = await httpClient.SendAsync(request)) {
        //...other code
0
Nkosi 5 avril 2017 à 11:40

Pouvez-vous changer comme suit

public async Task<bool> RevokeLicenseAsync([FromBody]string userId),

Si vous faites une demande de publication avec un paramètre de type, vous devez spécifier FromBody ou FormUri

1
Mustafa Tığ 5 avril 2017 à 11:24