Проблема связи с сервисом Janrain "auth_info" в WCF - PullRequest
0 голосов
/ 01 июля 2011

Так что я застрял в этой точке.Я пытаюсь связаться с сервисом JanRain "auth_info".Фактически, для начала я просто пытаюсь получить сообщение об ошибке / объект / '. Jsthingy', которое вы получаете, когда просматриваете его прямо в браузере:

https://rpxnow.com/api/v2/auth_info

но я хочу получить это обратно с помощью вызова WCF.

Согласно Fiddler, тип содержимого информации по этому URL-адресу - text / javascript .Однако, насколько я могу судить, WCF не дает мне такой возможности при вызове через WCF.Я получаю два варианта: WebMessageFormat.Json или WebMessageFormat.Xml.

В Visual Studio возникает следующая ошибка:

Исключительная ситуация InvalidOperationException не обрабатывается кодом пользователя - входящее сообщение имеетнеожиданный формат сообщения «Raw».Ожидаемые форматы сообщений для операции: «Xml», «Json».Это может быть потому, что в привязке не настроен WebContentTypeMapper.См. Документацию WebContentTypeMapper для получения более подробной информации.

WTF?Так может ли WCF сделать это?(Я подозреваю, что еще более ручное решение впереди)

Примерам онлайнового кода JanRain немного не хватает в примерах C #.

Их ссылка на документацию по auth_info здесь https://rpxnow.com/docs#auth_info

Адрес их службы auth_info здесь:

https://rpxnow.com/api/v2/auth_info

[TestMethod]
public void CallJanRain()
{
    var x = new JanRainProxy("https://rpxnow.com/api/v2");

    x.GetAuthInfo("", ""); //the params are apiKey, and token. not passing either at the moment as I want to be able to know how to at least handle the error first. After all, the *browser* at least got it.. 
}


  [ServiceContract]
    public interface IJanRainContract
    {
        [OperationContract(Name="auth_info")]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat =  WebMessageFormat.Xml)]
        JanRainAuthInfo GetAuthInfo(string apiKey, string token);
    }


 [DataContract]
    public class JanRainAuthInfo
    {
        [DataMember(Name="identifier")]
        public string Identifier { get; set; }
    }

 public class JanRainProxy: ClientBase<IJanRainContract>
    {
        public JanRainProxy(string url, WebHttpSecurityMode securityMode = WebHttpSecurityMode.Transport)
            : base(ConstructEndpoint(url, securityMode))
        {

        }


        //JanRainContract
    public JanRainAuthInfo GetAuthInfo(string apiKey, string token)
    {
         return base.Channel.GetAuthInfo(apiKey, token);
    }

    // This method constructs a WebHttpBinding endpoint with all the appropriate
    // settings for talking to our services.
    private static ServiceEndpoint ConstructEndpoint(string serviceUri, WebHttpSecurityMode securityMode)
    {
        var contract = ContractDescription.GetContract(typeof(IJanRainContract));
        var binding = new WebHttpBinding(securityMode);
                          //{
                          //    MaxBufferPoolSize = 524288000,
                          //    MaxReceivedMessageSize = 65536000
                          //};

        var address = new EndpointAddress(serviceUri);
        var endpoint = new ServiceEndpoint(
            contract,
            binding,
            address);

        var webHttpBehavior = new WebHttpBehavior()
        {
            DefaultBodyStyle = WebMessageBodyStyle.Wrapped,
            DefaultOutgoingRequestFormat = WebMessageFormat.Json,
            DefaultOutgoingResponseFormat = WebMessageFormat.Json,
            AutomaticFormatSelectionEnabled = true,
            FaultExceptionEnabled = true
        };

        endpoint.Behaviors.Add(webHttpBehavior);
        return endpoint;
    }
}

Я полагаю, что, возможно, мне следует оставить тип контента на json и настроить поведение или привязку.

Ответы [ 2 ]

0 голосов
/ 09 мая 2014

Кевин,

Вот пример C # о том, как обработать ответ auth_info, который может оказаться полезным:

//C# Helper Class for Janrain Engage
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
using System.Xml;
using System.Xml.XPath;
public class Rpx
{
    private string apiKey;
    private string baseUrl;
    public Rpx(string apiKey, string baseUrl) {
        while (baseUrl.EndsWith("/"))
            baseUrl = baseUrl.Substring(0, baseUrl.Length - 1);
        this.apiKey = apiKey;
        this.baseUrl = baseUrl;
    }
    public string getApiKey() { return apiKey; }
    public string getBaseUrl() { return baseUrl; }
    public XmlElement AuthInfo(string token) {
        Dictionary<string,string> query = new Dictionary<string,string>();
        query.Add("token", token);
        return ApiCall("auth_info", query);
    }
    public List<string> Mappings(string primaryKey) {
        Dictionary<string,string> query = new Dictionary<string,string>();
        query.Add("primaryKey", primaryKey);
        XmlElement rsp = ApiCall("mappings", query);
        XmlElement oids = (XmlElement)rsp.FirstChild;
        List<string> result = new List<string>();
        for (int i = 0; i < oids.ChildNodes.Count; i++) {
            result.Add(oids.ChildNodes[i].InnerText);
        }
        return result;
    }
    public Dictionary<string,ArrayList> AllMappings() {
        Dictionary<string,string> query = new Dictionary<string,string>();
        XmlElement rsp = ApiCall("all_mappings", query);
        Dictionary<string,ArrayList> result = new Dictionary<string,ArrayList>();
        XPathNavigator nav = rsp.CreateNavigator();
        XPathNodeIterator mappings = (XPathNodeIterator) nav.Evaluate("/rsp/mappings/mapping");
        foreach (XPathNavigator m in mappings) {
            string remote_key = GetContents("./primaryKey/text()", m);
            XPathNodeIterator ident_nodes = (XPathNodeIterator) m.Evaluate("./identifiers/identifier");
            ArrayList identifiers = new ArrayList();
            foreach (XPathNavigator i in ident_nodes) {
                identifiers.Add(i.ToString());
            }
            result.Add(remote_key, identifiers);
        }
        return result;
    }
    private string GetContents(string xpath_expr, XPathNavigator nav) {
        XPathNodeIterator rk_nodes = (XPathNodeIterator) nav.Evaluate(xpath_expr);
        while (rk_nodes.MoveNext()) {
            return rk_nodes.Current.ToString();
        }
        return null;
    }
    public void Map(string identifier, string primaryKey) {
        Dictionary<string,string> query = new Dictionary<string,string>();
        query.Add("identifier", identifier);
        query.Add("primaryKey", primaryKey);
        ApiCall("map", query);
    }
    public void Unmap(string identifier, string primaryKey) {
        Dictionary<string,string> query = new Dictionary<string,string>();
        query.Add("identifier", identifier);
        query.Add("primaryKey", primaryKey);
        ApiCall("unmap", query);
    }
    private XmlElement ApiCall(string methodName, Dictionary<string,string> partialQuery) {
        Dictionary<string,string> query = new Dictionary<string,string>(partialQuery);
        query.Add("format", "xml");
        query.Add("apiKey", apiKey);
        StringBuilder sb = new StringBuilder();
        foreach (KeyValuePair<string, string> e in query) {
            if (sb.Length > 0) {
                sb.Append('&');
            }
            sb.Append(System.Web.HttpUtility.UrlEncode(e.Key, Encoding.UTF8));
            sb.Append('=');
            sb.Append(HttpUtility.UrlEncode(e.Value, Encoding.UTF8));
        }
        string data = sb.ToString();
        Uri url = new Uri(baseUrl + "/api/v2/" + methodName);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = data.Length;
        // Write the request
        StreamWriter stOut = new StreamWriter(request.GetRequestStream(),
                                              Encoding.ASCII);
        stOut.Write(data);
        stOut.Close();
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream dataStream = response.GetResponseStream ();
        XmlDocument doc = new XmlDocument();
        doc.PreserveWhitespace = false;
        doc.Load(dataStream);
        XmlElement resp = doc.DocumentElement;
        if (resp == null || !resp.GetAttribute("stat").Equals("ok")) {
            throw new Exception("Unexpected API error");
        }
        return resp;
    }
    public static void Main(string[] args) {
        Rpx r = new Rpx(args[0], args[1]);
        if (args[2].Equals("mappings")) {
            Console.WriteLine("Mappings for " + args[3] + ":");
            foreach(string s in r.Mappings(args[3])) {
                Console.WriteLine(s);
            }
        }
        if (args[2].Equals("all_mappings")) {
            Console.WriteLine("All mappings:");
            foreach (KeyValuePair<string, ArrayList> pair in r.AllMappings()) {
                Console.WriteLine(pair.Key + ":");
                foreach (string identifier in pair.Value) {
                    Console.WriteLine("  " + identifier);
                }
            }
        }
        if (args[2].Equals("map")) {
            Console.WriteLine(args[3] + " mapped to " + args[4]);
            r.Map(args[3], args[4]);
        }
        if (args[2].Equals("unmap")) {
            Console.WriteLine(args[3] + " unmapped from " + args[4]);
            r.Unmap(args[3], args[4]);
        }
    }
}

Источник кода: https://github.com/janrain/Janrain-Sample-Code/blob/master/c-sharp/csharp-helper-class.cs

0 голосов
/ 01 июля 2011

хорошо .. похоже, мне нужно было добавить пользовательский contentTypeMapper на мою привязку

после объявления моей привязки я добавил следующее:

    WebContentTypeMapper customMapper = new JsonContentTypeMapper();
    binding.ContentTypeMapper = customMapper;

вот пользовательский Mapper:

  public class JsonContentTypeMapper : WebContentTypeMapper
    {
        public override WebContentFormat
                   GetMessageFormatForContentType(string contentType)
        {
            if (contentType == "text/javascript")
            {
                return WebContentFormat.Raw;
            }
            else
            {
                return WebContentFormat.Json;
            }
        }
    }
...