【问题标题】:Property or indexer 'AuthenticationHeaderValue.Parameter' cannot be assigned to -- it is read only无法将属性或索引器“AuthenticationHeaderValue.Parameter”分配给 - 它是只读的
【发布时间】:2018-09-17 03:44:48
【问题描述】:
public IList<FormResponse> GetForms(HttpRequestMessage request)
{
       string storeCode = ExtractBasicAuthUserFromHeader(request);
       List<Form> forms = _apiRepository.GetForms(storeCode);     ///23424324  
       return forms;
}

 private string ExtractBasicAuthUserFromHeader(HttpRequestMessage reqeust)
 {
    Encoding encoding = Encoding.GetEncoding("iso-8859-1");
    string usernamePassword = encoding.GetString(Convert.FromBase64String(reqeust.Headers.Authorization.Parameter 
     ));

      return usernamePassword.Substring(0, usernamePassword.IndexOf(':'));
  }

我写了下面的测试来测试上面

private readonly Mock<IApiRepository> _apiRepository = new Mock<IApiRepository>();


[TestInitialize]
public void Init()
{
    _apiRepository.Setup(x => x.GetForms("23424324")).Returns(_forms); //skipping FromBase64String converation for understanding
}


 [TestMethod]
 public void GetForms_ReturnFormList()
 {
  HttpRequestMessage reqeust = new HttpRequestMessage(); ;

  //Error   CS0200  Property or indexer 'AuthenticationHeaderValue.Parameter' cannot be assigned to -- it is read only  
reqeust.Headers.Authorization.Parameter = "23424324:12341234123"; 

  IList<FormResponse> formList = _formService.GetForms(reqeust);

  Assert.AreEqual(formList.Count, 2);
 }

出现以下错误

错误 CS0200 无法将属性或索引器“AuthenticationHeaderValue.Parameter”分配给 -- 它是只读的

想知道如何模拟 HttpRequestMessage reqeust = new HttpRequestMessage(); 添加 reqeust.Headers.Authorization.Parameter 基本字符串 在服务类中测试 GetForms 功能

【问题讨论】:

  • 您应该将reqeust.Headers.Authorization的整个值设置为request.Headers.Authorization = new AuthenticationHeaderValue(somesceme, someparameter");
  • 解决了我的问题,没想到这么简单 :) 请将其添加为答案,

标签: c# unit-testing


【解决方案1】:

request.Headers.Authorization 的类型为 AuthenticationHeaderValue,并且此类具有属性 SchemeParameter。这些属性是现成的。

您正在收到错误,因为您试图为这些现成的属性赋值。

您需要做的是通过创建AuthenticationHeaderValue 类的对象来为request.Headers.Authorization 赋值。

考虑进行以下操作。

request.Headers.Authorization = new AuthenticationHeaderValue(somescheme, someparameter);

您需要在上面的代码中用实际值代替someschemesomeparameter

您可以在下面提到的链接中获取有关 HttpRequestMessageAuthenticationHeaderValue 类的详细信息。

https://msdn.microsoft.com/en-us/library/system.net.http.headers.authenticationheadervalue(v=vs.118).aspx

https://msdn.microsoft.com/en-us/library/system.net.http.httprequestmessage(v=vs.118).aspx

https://msdn.microsoft.com/en-us/library/system.net.http.headers.httprequestheaders(v=vs.118).aspx

【讨论】:

    【解决方案2】:

    你可以这样使用:

    client.DefaultRequestHeaders.Authorization =
           new AuthenticationHeaderValue("key", "=" + value);
    

    更多: Setting Authorization Header of HttpClient

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-22
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多