2 votes

FatSecret C# wrapped api renvoie une réponse nulle dans WPF

J'ai un problème intéressant avec le FatSecret C# api . Il fonctionne bien dans une application C# Console, mais ne fonctionne pas dans une application WPF ou C# Forms. La réponse du serveur est toujours nulle. J'ai vérifié trois fois les clés de sécurité, je l'ai compilé pour différentes versions du cadre .Net, et rien n'a vraiment aidé.

Quelqu'un a-t-il rencontré des problèmes similaires ?

Ma solution alternative serait de créer une DLL à partir de l'application console (puisque je n'ai besoin que de quelques fonctions de l'API), et de la référencer à partir de mon projet WPF, mais je ne sais pas vraiment ce que je dois faire pour que cela fonctionne.

Voici un exemple de code dans les formulaires C#, réalisé juste pour cela.

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                string consumerKey = "hidden";
                string consumerSecret = "hidden";

                FoodSearch fs = new FoodSearch(consumerKey, consumerSecret);

                var response = fs.GetResponseSynchronously(new FoodSearchRequest()
                {
                    SearchExpression = this.textBox1.Text
                });

                if (response.HasResults)
                {
                    foreach (var food in response.foods.food)
                    {
                        string name = food.food_name;

                        listBox1.Items.Add(name);
                    }

                }
            }
            catch (Exception error)
            {
                MessageBox.Show(error.ToString());
            }

        }
    }
}

Merci d'avance

0voto

tofutim Points 5045

Y a-t-il un app.config qui est généré ? Il doit se trouver au niveau de l'exe de votre application.

0voto

Mac Points 1

Utilisation de FatSecretSharp dans une application WinForm/WPF Vous devez placer la demande dans un fichier de type BackgroundWorker 's DoWork(object sender, DoWorkEventArgs e) méthode

par exemple :

  1. Créez une nouvelle application winform/wpf et ajoutez les éléments suivants FatSecretSharp.Services aux arbitres
  2. Ajoutez un bouton avec son écouteur de clic et une icône BackgroundWorker avec son DoWork() l'auditeur du formulaire
  3. Encapsuler le FoodSearchExample() de la méthode " FatSecretSharp.Examples.ConsoleApp " dans le site DoWork(object sender, DoWorkEventArgs e) de l'écouteur du composant "backgroundworker" :

.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{
        var searchTerm = "apple";

        if (foodSearch == null) {
            foodSearch = new FoodSearch(consumerKey, consumerSecret);
        }

        var response = foodSearch.GetResponseSynchronously(new FoodSearchRequest()
        {
            SearchExpression = searchTerm
        });

        if (response.HasResults) {
            Debug.WriteLine("Got " + response.foods.food.Count + " Results: \n\n");
            var form = "id: {0}, \n - type: {1}, \n - name: {2}, \n - description: {3}";
            foreach (var food in response.foods.food) {
                Debug.WriteLine(String.Format(form, food.food_id, food.food_type, food.food_name, food.food_description));
            }
        } else {
            Debug.WriteLine("No results from term: " + searchTerm);
        }
}

PS : J'ai changé le Console.WriteLine a Debug.WriteLine

0voto

Rajesh Bankar Points 1

J'ai rencontré le même problème avec l'API FatSecret. Pour cela, j'ai simplement ajouté la dll FatsecretSharp.win qui est disponible dans "platform.fatsecret.com" et j'ai créé un service web en utilisant le même code que celui écrit dans l'application console. En créant le même service, j'ai résolu mon problème.

Vous devez simplement ajouter le fichier fatsecretsharp.win.dll que vous obtiendrez à partir de l'exemple de code Fatsecretapis sur le site Web.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using FatSecretSharp.Services;
using FatSecretSharp.Services.Requests;
using System.Web.Script.Services;
using System.Web.Script.Serialization;

namespace WebService1
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {
        private static string consumerKey = string.Empty;
        private static string consumerSecret = string.Empty;

        private static FoodSearch foodSearch;

        public Service1()
        {

            //Uncomment the following line if using designed components 
            //InitializeComponent(); 
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string SearchFood(string searchExpression)
        {
            try
            {
                consumerKey = "your consumer Key";

                consumerSecret = "your consumer Secret ";

                var searchTerm = searchExpression;

                foodSearch = new FoodSearch(consumerKey, consumerSecret);

                var response = foodSearch.GetResponseSynchronously(new FoodSearchRequest()
                                    {
                                        SearchExpression = searchTerm,

                                        MaxResults = 50,
                                        PageNumber = 0
                                    });

                if (response != null && response.HasResults)
                {

                    return new JavaScriptSerializer().Serialize(response);
                }
                else
                {

                    return null;
                }
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

        }

           }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X