具有Basic Auth的ServiceStack MonoTouch客户端 - JSON分析器和Cookie异常

时间:2012-09-27 09:46:38

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

首先,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

  3. 内部异常:

      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序列化程序因未知原因而放弃。有趣的是,如果我禁用身份验证,相同的代码片段可以正常工作 - 通过POST搜索请求异步获取DTO列表:

    client.SendAsync<IList<DTO.Report>>(searchRequest, OnSuccess, OnError)

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

1 个答案:

答案 0 :(得分:2)

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

我猜大多数问题源于使用客户端的单个实例,而不是每个请求使用一个新实例。所以有错误......当我改变功能以获得每个请求的新客户端(一个小工厂,各种各样)时,POST Auth对象完美地工作,其他一切都追随 - 似乎现在一切都运行得很好,包括BasicAuth和CredentialsAuth。

故事的要点,using块是你与客户的朋友,一切都指向重新使用客户端实例是一个很大的禁忌 - 至少这是我现在能说的从问题和解决方案。