WebApi request body

0

Cześć, właśnie zabieram się za pisanie aplikacji WebAPI i mam pierwszy problem. W parametrze do metody przyjmującej requesta mam wpisane [FromBody] string value, natomiast w aplikacji klienckiej buduję content posta przy pomocy streamWritera, podmieniam to co chce wysłać do tej metody na bajty no i wpisuje do streama. Stawiam breakpointa w metodzie przyjmującej zapytanie i parametr value jest pusty. Możecie mi powiedzieć co źle robię? Wysyłam zapytanie przy pomocy HttpWebRequest. Z góry dzięki

0

Pokaż kod. Może źle to wysyłasz i wcale to nie jest string? Patrzyłeś na to? Nie masz w metodzie w WebAPi dwóch parametrow FromBody?

0
                CookieContainer LoginCookies = new CookieContainer();
                string kodStrony;
                var request = HttpWebRequest.Create("http://localhost:50724/api/values") as HttpWebRequest;

                //var ciastka = new System.Net.CookieContainer();

                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.UserAgent = "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:30.0) Gecko/20100101 Firefox/30.0";
                request.CookieContainer = LoginCookies;
                request.KeepAlive = true;
                byte[] buffer = Encoding.UTF8.GetBytes(string.Format("value=aaa"));
                request.ContentLength = buffer.Length;

                IWebProxy proxy = request.Proxy;
                proxy.Credentials = CredentialCache.DefaultNetworkCredentials;

                using (var stream = request.GetRequestStream())
                {
                    stream.Write(buffer, 0, buffer.Length);
                }
                using (var response = request.GetResponse() as HttpWebResponse)
                {
                    using (var sr = new System.IO.StreamReader(response.GetResponseStream()))
                    {
                        kodStrony = sr.ReadToEnd();
                    }
                }

W ten sposób wysyłam dane, może macie jakiś inny łatwiejszy sposób :)?

0

ref

0

Nie mam pomysłu, ale spróbuj prostszego rozwiązania stąd:
http://stackoverflow.com/questions/13771032/post-string-to-asp-net-web-api-application-returns-null

0

W WebApi masz zapewne coś takiego:

// POST api/values
public void Post([FromBody]string value)
{
   if (!string.IsNullOrEmpty(value))
   {
      // Coś tam...
   }
}

Więc żeby przesłać tego stringa to możesz zrobić coś takiego:

using (var client = new HttpClient())
{
   client.BaseAddress = new Uri("http://localhost:51124");
   var content = new FormUrlEncodedContent(new[]
   {
      new KeyValuePair<string, string>("", "PRZESYLANY STRING")
   });
   var result = client.PostAsync("/api/values", content)
                        .Result;

   if (result.IsSuccessStatusCode)
   {
      Console.WriteLine("Przesłane!");
      //var stringResponse = result.Content.ReadAsStringAsync().Result;
   }
}

Musisz tylko z NuGet'a pobrać:
Install-Package Microsoft.AspNet.WebApi.Client

0

A jeszcze mam pytanko jak czymś takim mogę przekazać obiekt a później go odebrać? Rozumiem, że aby odebrać przekazywany obiekt muszę mieć szkielet klasy dla tego obiektu, tak?

0

Tak potrzebujesz mieć szkielet klasy. Na przykład:

class Product
{
   public string Name { get; set; }
   public double Price { get; set; }
   public string Category { get; set; }
}

Przykład GET:

HttpResponseMessage response = await client.GetAsync("api/products/1");
if (response.IsSuccessStatusCode)
{
   Product product = await response.Content.ReadAsAsync<Product>();
}

Przykład POST:

var gizmo = new Product() { Name = "Gizmo", Price = 100, Category = "Widget" };
var response = await client.PostAsJsonAsync("api/products", gizmo);
if (response.IsSuccessStatusCode)
{
   // ..
}
0

Wtedy w metodzie Web Api w parametrze robi się w ten sposób ...([FromBody]Product product), tak?

Jest może biblioteka umożliwiająca tak łatwą wymianę danych jak to w ma javascript ($http), w której można wysłać dowolny stworzony obiekt, natomiast ze strony c# Web Api zbudować szkielet aby przyjąć taki obiekt. Samo przesyłanie stringa jest dziwne, możesz mi wytłumaczyć dlaczego używa się KeyValuePair<string, string>("", "PRZESYLANY STRING"), zamiast zwykłęgo stringa? Nie ma jakiegoś prostszego sposobu? Dzięki bardzo za odpowiedź :)

0
Dalmatynczyk napisał(a):

Wtedy w metodzie Web Api w parametrze robi się w ten sposób ...([FromBody]Product product), tak?

To [FromBody] jest chyba zbędne.

Dalmatynczyk napisał(a):

Jest może biblioteka umożliwiająca tak łatwą wymianę danych jak to w ma javascript ($http), w której można wysłać dowolny stworzony obiekt, natomiast ze strony c# Web Api zbudować szkielet aby przyjąć taki obiekt.

C# to język obiektowy silnie typowany czemu chcesz pisać w nim jak w JS który jest całkowicie inny? Zawsze możesz użyć dynamic i nie będziesz musiał tworzyć takich klas.

Dalmatynczyk napisał(a):

Samo przesyłanie stringa jest dziwne, możesz mi wytłumaczyć dlaczego używa się KeyValuePair<string, string>("", "PRZESYLANY STRING"), zamiast zwykłęgo stringa? Nie ma jakiegoś prostszego sposobu? Dzięki bardzo za odpowiedź :)

Bo WebAPI ma jakieś życiowe problemy z StringContent nie do końca jestem pewien dlaczego.

0

Miałbym jeszcze jedno pytanie na temat response a dokładniej jego contentu. Przy POST'cie zwracam z Web Api obiekt, który chce odebrać z content'u responsa. Za nic nie mogę tego zrobić metodami asynchronicznymi

The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

Na dodatek nie mogę zrobić metody asynchronicznej bo jakbym po prostu nie miał biblioteki od tego.

0

Nie wiem czy to dobrze rozumiem ale występuje mi błąd

cannot access a disposed object
            using(var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://localhost:50724");

                var gizmo = new { Name = "Woda", bbbaaa = "3030", aaa = 20 };
                var response = client.PostAsJsonAsync("api/values", gizmo).Result;

                if(response.IsSuccessStatusCode)
                {
                    var abc = Method(response);
                }
                    
            }

Tutaj jest metoda, która dostaje referencje httpwebresponse i w tej metodzie czyta content responsa


        public async Task<string> Method(HttpResponseMessage response)
        {
            var a = await response.RequestMessage.Content.ReadAsStringAsync();
            return a;
        }

Jeżeli źle myślę to poprawcie

0

Nie wiem co ci się tam podziało ale tutaj masz przykład (na samym dole):
http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

0

Nie widzę tutaj responsa content'u z metody POST'owej a chce dostać informacje czy przy poście wszystko wyszło w porządku czy był jakiś błąd, nie będę GET'a na coś takiego tworzył a nie wychodzi mi rozczytanie content'u responsa.
Odnośnie tego błędu to nie wiem o co chodzi bo w ogóle nic nie robię z instancją responsa a mimo tego mam błąd disposed object

0

https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-xfp1/v/t34.0-12/12380077_952659491495503_757882892_n.jpg?oh=48a48fe53ca1728574c59cbd9bd5f942&oe=566F16E3&__gda__=1450062217_bed2986f58509d6157b865b2289c327f

Na screenie pokazane jest, że jednak dane przychodzą ale nie potrafie ich wyciągnąć a ta metoda, która jest debugowana ReadAsStringAsync po prostu zwraca status failured. Nie mam pojęcia co jest grane, wszędzie gdzie taką metodę znajdę to wszystkim działa a u mnie po prostu jest zonk. Co robię źle?

0
string aaaa = response.Content.ReadAsStringAsync().Result;
0

Niestety dalej to samo. Może problem jest w tym jak zwracam dane w responsie?

        public IHttpActionResult Post([FromBody]jajeczko value)
        {
            var a = value;
            return Ok(a);
        }
0

Mam wyświetlane w resultcie - Not yet computed, method na NULL. Nie mam pojęcia o co tutaj chodzi :/

0

Odświeżam, pomóżcie bo mam zastój. Może jakiś inny sposób na pytania aplikacji webapi przez klienta?

0

Możesz gdzieś wrzucić oba projekty web api i klienta to mogę na to spojrzeć.

0

A dałoby radę jakiś kontakt priv dostać? No siedzę z tym tyle czasu i nie mogę dojść o co tutaj chodzi, wszystkim w podobnych tematach trybi a mi nie chce, coś źle robię tylko nie wiem co...

1 użytkowników online, w tym zalogowanych: 0, gości: 1