将价值从Angular服务应用发送到C#后端控制器

时间:2018-10-30 16:11:34

标签: c# angular typescript

我对此感到非常疯狂,我已经尝试了几乎所有方法,并且找不到从服务向后端传递字符串值以基于该字符串返回Json结果的方法。

这是问题所在,我有一个后端,它使用元信息来烹饪所有JSON  前端提供,然后将它们返回到前端进行显示,在这种情况下,我必须获取一个基于过滤器的JSON,该过滤器由插入前端的字符串构成,但找不到将字符串传递给后端的方法,并且我不想通过URL传递它。

这是我的代码:

角度打字稿服务:我想通过"whr"

getAdvancedFilterResult(concept: string, whr: string): Promise<any> {

  const headers: Headers = new Headers({
    'Content-Type': 'application/json'
  });
  this.authService.getAuthorizationHeader(headers);
  headers.append('IdLng', this.config.idLanguage);

  const options: RequestOptions = new RequestOptions();
  options.headers = headers;

  return this.http.get(this.config.apiDomain + this.config.apiEndpointEntities + '/' + concept + '/' + "filtered",
      options
    )
    .toPromise()
    .then(
      response => response.json() as any[]
    )
    .catch((error) => this.customHandleError(error, this.toastrService));
}

后端控制器:

[Route("api/Entities/{entity}/filtered/")]
public HttpResponseMessage GetFilter(string entity) {

  HttpResponseMessage response = new HttpResponseMessage();
  string action = "READ";

  //Check Authorization
  AuthorizationResponse authResponse = AuthProvider.CheckAuthorization(new AuthorizationRequest() {
    SCode = UserUtils.GetUserSCode(User),
      ConceptString = entity,
      ActionString = action,
      UserId = UserUtils.GetUserID(User),
      ExtraParameters = new AuthorizationRequest.ExtraParamaters() {
        IdsOnly = false, Where = "!!!!!WHR HERE!!!!"
      }
  });
  if (authResponse.IsAuthorized) {
    //code
    response = Request.CreateResponse(HttpStatusCode.OK, json);
  } else {
    response = Request.CreateResponse(HttpStatusCode.Unauthorized);
  }
  return response;
}

我应该将它与header一起通过headers.append('whr', whr);,然后传递到options上的http.get还是body进入options.body = whr;

另外,如何在后端使用它?

2 个答案:

答案 0 :(得分:2)

您应该像这样传递标题:

getAdvancedFilterResult(concept: string, whr: string): Promise<any> { 
  this.authService.getAuthorizationHeader(headers);
  let headers: HttpHeaders = new HttpHeaders();
  headers = headers.append('Content-Type', 'application/json');
  headers = headers.append('x-corralation-id', '12345');
  headers = headers.append('IdLng', this.config.idLanguage);
  headers = headers.append('whr', whr);

  const options: RequestOptions = new RequestOptions();
  options.headers = headers;

  return this.http.get(this.config.apiDomain + this.config.apiEndpointEntities + '/' + concept + '/' + "filtered",
      options
    )
    .toPromise()
    .then(
      response => response.json() as any[]
    )
    .catch((error) => this.customHandleError(error, this.toastrService));
}

要在服务器端获取标头,请尝试以下操作:

[Route("api/Entities/{entity}/filtered/")]
public HttpResponseMessage GetFilter(string entity) {

  var request = Request;
  var headers = response.Headers;
  HttpResponseMessage response = new HttpResponseMessage();
  string action = "READ";
  var whrHeader = headers.Contains("whr") ? request.Headers.GetValues("whr").First() : ""

  AuthorizationResponse authResponse = AuthProvider.CheckAuthorization(new AuthorizationRequest() {
    SCode = UserUtils.GetUserSCode(User),
      ConceptString = entity,
      ActionString = action,
      UserId = UserUtils.GetUserID(User),
      ExtraParameters = new AuthorizationRequest.ExtraParamaters() {
        IdsOnly = false,
        Where = whrHeader
      }
  });
  if (authResponse.IsAuthorized) {
    //code
    response = Request.CreateResponse(HttpStatusCode.OK, json);
  } else {
    response = Request.CreateResponse(HttpStatusCode.Unauthorized);
  }
  return response;
}

答案 1 :(得分:2)

我有了SiddAjmera的解决方案!

在前端服务:

getAdvancedFilterResult(concept: string, whr: string): Promise<any> {
  let headers: Headers = new Headers();
  this.authService.getAuthorizationHeader(headers);
  headers.append('Content-Type', 'application/json');
  headers.append('IdLng', this.config.idLanguage);
  headers.append('whr', whr);

  const options: RequestOptions = new RequestOptions();
  options.headers = headers;
  return this.http.get(
      this.config.apiDomain + this.config.apiEndpointEntities + '/' + concept + '/' + "filtered",
      options
    )
    .toPromise()
    .then(
      response => response.json() as any[]
    )
    .catch((error) => this.customHandleError(error, this.toastrService));
}

然后在后端,仅使用已经制成的UserUtils来获取具有值'whr'的标头并将其通过函数传递。

UserUtilis.cs:

public static string Where(HttpRequestMessage re) {
  string whereCLause = "";

  var headers = re.Headers;
  if (headers.Contains("whr")) {
    whereCLause = headers.GetValues("whr").First();
  } else {
    whereCLause = " ";
  }
  return whereCLause;
}

Controller.cs

...
var re = Request;

HttpResponseMessage response = new HttpResponseMessage();
string action = "READ";

//Check Authorization
AuthorizationResponse authResponse = AuthProvider.CheckAuthorization(new AuthorizationRequest() {
  SCode = UserUtils.GetUserSCode(User),
    ConceptString = entity,
    ActionString = action,
    UserId = UserUtils.GetUserID(User),
    ExtraParameters = new AuthorizationRequest.ExtraParamaters() {
      IdsOnly = false, Where = UserUtils.Where(re)
    }
});
...