2011-07-01 62 views
0

所以我被困在这一点。我正在尝试与JanRain的“auth_info”服务进行通信。事实上,开始,我只是试图让“错误”消息/对象/当你直接在浏览器中浏览它,你得到“jsthingy。”:与WCF中的Janrain“auth_info”服务进行通信的问题

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

但我想通过WCF调用返回。

根据Fiddler,该网址信息的内容类型为text/javascript。不过,从我所知道的情况来看,当通过WCF调用WCF时,WCF不会给我这个选项。我有两个选择:WebMessageFormat.JsonWebMessageFormat.Xml

我碰到下面的错误在Visual Studio:

InvalidOperationException异常是由用户代码未处理 - 传入的消息有一个意外的消息格式“原始”。预期的操作消息格式是'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离开的contentType并调整行为或绑定。

+0

不知道,但是这看起来可能是我所需要的:http://msdn.microsoft.com/en-us/库/ bb943479.aspx – KevinDeus

回答

0

确定..它看起来像我需要在我宣布我结合后结合

添加自定义contentTypeMapper我增加了以下内容:

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

这里的自定义映射:

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

Kevin,

这是一个关于如何处理auth_in的C#示例FO响应,你可能会发现有用:

//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