【问题标题】:ServiceStack MonoTouch client with Basic Auth - JSON Parser and Cookie exceptions具有基本身份验证的 ServiceStack MonoTouch 客户端 - JSON 解析器和 Cookie 异常
【发布时间】:2012-09-27 09:46:38
【问题描述】:

对于初学者来说,BasicAuth 似乎在服务端进行了正确配置(该服务是一个 REST 服务,继承自 RestServiceBase,如果这在这里很重要的话),至少在使用浏览器时它工作得非常好。

当我尝试在 MonoTouch 下使用客户端进行服务时,这里有两个问题(我正在使用 IServiceClient 接口和 JsonServiceClient 支持它):

  1. 当我输入错误的凭据时,我会收到“用户名或密码无效”的异常消息,这一切都很好。但是,当我第二次输入 ANYTHING 时,无论是正确还是错误的凭据,并尝试发送请求,我都会收到 Internal Server Error 异常,其中 ReponseDto 包含:

    Error Code: Cookie Exception, Message: The 'Name' = '$Version' part of the cookie is invalid

    我正在使用SetCredentials 方法,AlwaysSendBasicAuthHeader 设置为true(但这并不重要,当它设置为false 时,同样的事情发生了)。知道为什么会发生这种情况以及如何解决吗?

  2. 现在让我们假设我第一次提供了正确的凭据(当一切正常时),初始身份验证正常。现在,当我尝试从标有 [Authenticate] 属性的服务中获取 DTO 时,我得到:

    ServiceStack.ServiceClient.Web.WebServiceException: Internal Server Error

内部异常:

  System.IndexOutOfRangeException: Array index is out of range.
  at ServiceStack.Text.Json.JsonTypeSerializer.EatValue (System.String value, System.Int32& i) [0x00000] in <filename unknown>:0 
  at ServiceStack.Text.Json.JsonTypeSerializer.EatTypeValue (System.String value, System.Int32& i) [0x00000] in <filename unknown>:0 
  at ServiceStack.Text.Common.DeserializeListWithElements`2[DTO.Report,ServiceStack.Text.Json.JsonTypeSerializer].ParseGenericList (System.String value, System.Type createListType, ServiceStack.Text.Common.ParseStringDelegate parseFn) [0x00000] in <filename unknown>:0 
  at ServiceStack.Text.Common.DeserializeList`2+<GetParseFn>c__AnonStoreyB[System.Collections.Generic.IList`1[DTO.Report],ServiceStack.Text.Json.JsonTypeSerializer].<>m__37 (System.String value) [0x00000] in <filename unknown>:0 
  at ServiceStack.Text.JsonSerializer.DeserializeFromString (System.String value, System.Type type) [0x00000] in <filename unknown>:0 
  at ServiceStack.Text.JsonSerializer.DeserializeFromStream (System.Type type, System.IO.Stream stream) [0x00000] in <filename unknown>:0 
  at ServiceStack.ServiceClient.Web.AsyncServiceClient.HandleResponseError[IList`1] (System.Exception exception, ServiceStack.ServiceClient.Web.RequestState`1 requestState) [0x00000] in <filename unknown>:0 }

据我所知,这意味着 JSON 序列化程序因未知原因而放弃。有趣的是,如果我禁用身份验证,同一段代码可以正常工作 - 通过POSTing 搜索请求异步获取 DTO 列表:

client.SendAsync&lt;IList&lt;DTO.Report&gt;&gt;(searchRequest, OnSuccess, OnError)

第一点的问题仍然存在:为什么?如何解决? :)

【问题讨论】:

    标签: c# web-services rest xamarin.ios servicestack


    【解决方案1】:

    好的,开始工作了。 ServiceStack 本身没有任何问题,现在我认为我在公然滥用客户端功能。嗯,这不是一个聪明的举动,但也许其他人会从我的错误中吸取教训。

    我猜大部分问题源于使用客户端的单个实例,而不是每个请求都使用一个新实例。所以出现了错误...当我更改功能以根据请求获取新客户端(某种小工厂)时,POSTing 一个 Auth 对象运行良好,其他一切都在进行 - 似乎一切正常现在很好,使用 BasicAuth 和 CredentialsAuth。

    故事的重点,using 块是您与客户端的朋友,所有内容都表明重复使用客户端实例是一个很大的禁忌 - 至少这是我现在可以从问题和解决方案。

    【讨论】:

      猜你喜欢
      • 2012-01-03
      • 2016-01-09
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2011-01-28
      • 2017-08-15
      • 1970-01-01
      相关资源
      最近更新 更多