Hallöchen,
ich programmier gerade in C# eine OAuth-Lösung für Xing. Allerdungs erhalte ich immer einen Fehler und ich weiß nicht woran das liegt. Hier der Fehler:
Fehlermeldung:
In System.Net.WebException ist eine Ausnahme vom Typ "System.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.Zusätzliche Informationen: Der Remoteserver hat einen Fehler zurückgegeben: (400) Ungültige Anforderung.
Dazu der Passende Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Web;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using OAuth;
namespace Social_Connect
{
public partial class xing : Form
{
Manager oauth;
public xing()
{
InitializeComponent();
}
private void xing_Load(object sender, EventArgs e)
{
oauth = new OAuth.Manager();
// the URL to obtain a temporary "request token"
var rtUrl = "https://api.xing.com/v1/request_token";
oauth["consumer_key"] = "xxx";
oauth["consumer_secret"] = "xxxxxx";
oauth.AcquireRequestToken(rtUrl, "POST");
var url = "https://api.xing.com/v1/authorize?oauth_token=" + oauth["token"];
webBrowser1.Url = new Uri(url);
//System.Diagnostics.Process.Start(url);
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
string url = webBrowser1.Url.ToString();
if (url.Contains("authorized=true"))
{
var divMarker = "id=\"verifier\""; // the div for twitter's oauth pin
var index = webBrowser1.DocumentText.LastIndexOf(divMarker) + divMarker.Length;
var pin = webBrowser1.DocumentText.Substring(index+1, 4);
//var snip = webBrowser1.DocumentText.Substring(index);
//var pin = Regex.Replace(snip, "(?s)[^0-9]*([0-9]+).*", "$1").Trim();
Console.WriteLine(pin);
//webBrowser1.Visible = false; // all done with the web UI
oauth.AcquireAccessToken("https://api.xing.com/v1/access_token", "POST", pin);
var appurl = "https://api.xing.com/v1/users/me";
var authzHeader = oauth.GenerateAuthzHeader(appurl, "GET");
var request = (HttpWebRequest)WebRequest.Create(appurl);
request.Method = "GET";
request.PreAuthenticate = true;
request.AllowWriteStreamBuffering = true;
request.Headers.Add("Authorization", authzHeader);
using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode != HttpStatusCode.OK)
MessageBox.Show("There's been a problem trying to tweet:" +
Environment.NewLine +
response.StatusDescription);
}
}
}
}
}
Der Bereich spuckt die Fehlermeldung aus:
using (var response = (HttpWebResponse)request.GetResponse())
Danke im Voraus.
MfG
iceman11
Vergleichen Dein Request mit Hilfe von Fiddler und Du wirst sehen, was mitgesendet wird und kannst es vergleichen mit dem was mitgesendet werden soll.
So ist das nur rumraten.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
danke für die Antwort. Leider konnte ich da nicht herausfinden woran das liegt.
Hast du vllt eine andere Idee oder jemand anderes eine Idee?
Wenns kein Fehler im Header gibt und nichts fehlt - wie Du sagst - dann ist es ein Fehler bei Xing.
Ich bezweifle aber, dass das stimmt, sonst würde 500 statt 400 kommen.
400 sagt aber, dass etwas fehlt oder fehlerhaft ist.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Viele Dienste mögen es nicht, wenn kein User Agent mitgeschickt wird. Vielleicht liegts daran?
LG
Nein leider klappt es auch nicht mit dem UserAgent.
Hab folgendes ausprobiert:
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36";
Hi iceman11,
"klappt nicht" ist keine Fehlerbeschreibung. Du bis im ersten Beitrag darauf hingeweisen worden, mit Fiddler zu schauen, was übertragen wird und was zurückkommt, und dann zu vergleichen, was dein Programm anders macht. Das würde man normalerweise so machen. Wenn du uns aber nicht sagst, was du dabei festgestellt hast, dann können wir dir wahrscheinlich auch nicht weiterhelfen.
Bitte beachte [Hinweis] Wie poste ich richtig?, besonders Punkt 4 ("Wälzt nicht eure Aufgaben auf uns ab") und 5 ("Problem genau beschreiben - inkl. genauer Fehlermeldung - und konkrete Fragen stellen"), 7 ("Nicht gleich pushen, nicht drängeln") und 8 ("Tut, worum man euch bittet").
Christian
Weeks of programming can save you hours of planning
Ja da hast du recht. Sorry. Ich muss mich wohl noch an Foren gewöhnen. Ich habe es nochmal den body der Fehlermeldung als JSON ausgelesen und folgendes kam heraus:
Fehlermeldung:
{"errors":[{"field":"oauth_verifier","reason":"UNEXPECTED"}],"message":"Unknown parameters given: oauth_verifier","error_name":"UNKNOWN_PARAMETER"}
Leider komme ich da nicht weiter.
Normalerweise bietet eine ensprechende API fertige Methoden an, sodass Du den Kruscht mit Webrequests gar nicht selbst machen musst.
Wenn man 30 Sekunden in Google investiert wird man auch ein Open-Source SDK für XING finden, damit man sich anschauen kann, wie die das machen:
https://netforxing.codeplex.com/releases/view/101708
Jedenfalls sieht das so bei Dir aus, dass er insgesamt Dein Authvorgang für ungültig erklärt.
Das mag daran liegen, dass - in der Theorie -
oauth = new OAuth.Manager();
// the URL to obtain a temporary "request token"
var rtUrl = "https://api.xing.com/v1/request_token";
oauth["consumer_key"] = "xxx";
oauth["consumer_secret"] = "xxxxxx";
oauth.AcquireRequestToken(rtUrl, "POST");
für den Vorgang ausreichen sollte.
Laut Doku kommt man ann an den accessToken via
var pin = "";
OAuthResponse accessToken = oauth.AcquireAccessToken("https://api.xing.com/v1/access_token", "POST", pin);
Du aber beachtest den AuthResponse überhaupt nicht.
Jede weitere Anfrage muss - laut offizieller Dokumentation - die OAuth-Header beinhalten. Kann ich jetzt bei Dir nicht wirklich sehen.
Ich rate Dir eine andere OAuth Bibliothek zu verwenden, zB DotNetOpenAuth, die oAuth 1.0 und 2.0 unterstützt; oder ein fertiges SDK.
Zu DotNetOpenAuth gibt's Millionen an Beispielen. Dadurch, dass OAuth standardisiert ist kannst Du jedes Beispiel, ob Facebook, Twitter und Co.. nutzen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke für deine Antwort, allerdings muss ich das verwenden.
Hab herausgefunden das der Verifier raus muss aber dann erhalte ich folgende Fehlermeldung:
Fehlermeldung:
{"message":"Invalid OAuth signature","error_name":"INVALID_OAUTH_SIGNATURE"}
Irgendwer eine Idee?