0

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

尝试在 MonoTouch 下将客户端用于服务时,我遇到了两个问题(我正在使用IServiceClient接口进行JsonServiceClient备份):

  1. 当我输入错误的凭据时,我会收到异常提示“用户名或密码无效”,这一切都很好。但是当我第二次输入任何东西时,无论是正确的还是错误的凭据,并尝试发送一个请求,我都会收到包含以下内容的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 序列化程序因未知原因而放弃。POST有趣的是,如果我禁用身份验证,同一段代码可以正常工作 -通过搜索请求异步获取 DTO 列表:

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

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

4

1 回答 1

2

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

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

故事的重点,usingblock 是你与客户的朋友,一切都表明重用客户实例是一个很大的禁忌——至少我现在可以从问题和解决方案中看出这一点。

于 2012-10-01T09:49:12.407 回答