Как исправить / диагностировать «Удаленный сервер возвратил ошибку: (400) Bad Request.» для запроса, работающего на сайте A, но не на сайте B - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть одноязычная служба C #, которая предоставляет свой API через контракт на обслуживание. Определенная функция прекрасно работает в среде разработки, которую я настроил, но я получаю ошибку 400 от этой службы по конкретному запросу (другие запросы работают нормально, их много ~ 25).

В основном это стек JS ui -> IIS (10) -> C # Service. Сбой запроса между IIS и службой C #.

Сайт работает под управлением IIS 10, а служба C # - C # 2015.

Я попытался переименовать функцию, изменив ее сигнатуру (создавая собственный класс, который передает оба параметра в одну строку JSON, а не в два отдельных элемента). Я также попробовал методы GET, POST и PUT и, используя метод POST, я получаю более высокий уровень успеха на сайтах (скажем, 14/16 работают с POST и только 6/16 работают с GET / PUT). Все они работают в среде разработки с набором диаграмм utf-8

Проблема состоит из трех частей. Сервис C # имеет интерфейс и класс, реализующий его:

[ServiceContract(SessionMode = SessionMode.NotAllowed)]
public interface ITreeQuery
{
     [WebInvoke(Method = "POST", UriTemplate = "GRTBP", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
     [OperationContract]
     TreeResult GRTBP(string query);
}

Класс:

[ServiceBehavior(IncludeExceptionDetailInFaults = true, AddressFilterMode = AddressFilterMode.Any, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
public class TreeQuery : ITreeQuery
{
 public TreeResult GRTBP(string query)
        {
            ReasonTreeQuery _query = JsonConvert.DeserializeObject<ReasonTreeQuery>(query);

            Func<string, string, List<List<AFCacheElement>>> getReasonTree = (value1, value2) => (_databaseMonitor.GetReasonTreeByPath(value1, value2));

            return Query(DecodeString(_query.ElementPath), DecodeString(_query.ElementTemplate), getReasonTree);
        }
}

Который вызывается из IIS с использованием:

public class ReasonTreeController : ApiController
{

    [Route("GetReasonTreeByPath")]
    public JObject GetReasonTreeByPath(string elementPath, string elementTemplate)
    {
        try
        {
            WebRequest webRequest = WebRequest.Create(@"https://" + System.Configuration.ConfigurationManager.AppSettings["LocalHost"] + @"/tree-query/GRTBP");

            webRequest.Method = @"POST";
            webRequest.ContentType = @"application/json; charset=utf-8";

            ReasonTreeQuery query = new ReasonTreeQuery(elementPath, elementTemplate);

            Dictionary<string, string> content = new Dictionary<string, string> {
                { "query", JsonConvert.SerializeObject(query) }
            };
            string jsonResponse = string.Empty;

            using (StreamWriter streamWriter = new StreamWriter(webRequest.GetRequestStream()))
            {
                streamWriter.Write(JsonConvert.SerializeObject(content));
                streamWriter.Flush();
                streamWriter.Close();


                HttpWebResponse httpResponse = (HttpWebResponse)webRequest.GetResponse();

                using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    jsonResponse = streamReader.ReadToEnd();
                }
            }

            JObject jObject = JObject.Parse(jsonResponse);

            return jObject;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

Полная ошибка (без трассировки стека):

«ExceptionMessage»: «Удаленный сервер возвратил ошибку: (400) Неверный запрос.»

но я ожидаю 200.

...