Ошибка при чтении тела сообщения запроса через JSON

Мне нужно прочитать содержимое сообщения из тела запроса в службе WCF REST, например:

СЕРВИСНЫЙ КОД

string request = Encoding.UTF8.GetString(OperationContext.Current.RequestContext.RequestMessage.GetBody<byte[]>());

Но я получаю сообщение об ошибке на стороне службы, что бы я ни пытался:

Ожидается элемент 'base64Binary' из пространства имен 'http://schemas.microsoft.com/2003/10/Serialization/'.. Обнаружен элемент 'Element' с именем 'Human', пространство имен 'http://numans.hr-xml.org/2007-04-15'.

а контракт на обслуживание определяется как:

 //[OperationContract(Name = "LoadMessages", IsOneWay = true)]
    [WebInvoke(Method = "POST",
        UriTemplate = "/LoadMessages",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare)]
    [Description("Inbound Message")]
    void LoadMessages();

и реализация выглядит так:

    public void LoadMessages()
    {
        string content = string.Empty;
        //var request = OperationContext.Current.RequestContext.RequestMessage.GetBody<FileState>();
        string request = Encoding.UTF8.GetString(OperationContext.Current.RequestContext.RequestMessage.GetBody<byte[]>());
 }

КОД КЛИЕНТА

Я отправляю следующее:

string jsonData = "{ \"categoryid\":\"" + file.CategoryId + "\",\"fileId\":\"" + file.FileId + "\" }";

Я пробовал много вариантов отправки данных от клиента, например:

var buffer = System.Text.Encoding.UTF8.GetBytes(jsonData);
var content = new ByteArrayContent(buffer);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

а также пробовал это:

var content = new StringContent(jsonData, Encoding.UTF8, "application/json");

Запрос на размещение:

 HttpResponseMessage executionResult = httpClient.PostAsync($"{url}/LoadMessages", content).Result;

Я также пробовал сериализацию / де-сериализацию на стороне клиента / сервера, но это тоже не работает.

Может ли кто-нибудь предложить образцы кода, которые я могу попробовать, которые могут сработать? Или укажите, что я делаю не так.

Еще несколько примеров того, что я пробовал с данными JSON:

 var jsonData = JsonConvert.SerializeObject(data, Formatting.Indented); 
 var details = JObject.Parse(data);

Вставка моей клиентской функции для ясности:

  HttpClient httpClient = new HttpClient(new HttpClientHandler());
  HttpStatusCode statusCode = HttpStatusCode.OK;
  string auditMessage = string.Empty;
  using (httpClient)
  {
     var url = ConfigurationManager.AppSettings["APIURL"];
     try
     {
        string jsonData = "{ \"categoryid\":\"" + file.CategoryId + "\",\"fileId\":\"" + file.FileId + "\" }";
                    
         //var jsonData = JsonConvert.SerializeObject(data, Formatting.Indented);
         //var details = JObject.Parse(data);

         //var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
        var buffer = System.Text.Encoding.UTF8.GetBytes(jsonData);
        var content = new ByteArrayContent(buffer);
                    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        HttpResponseMessage executionResult = httpClient.PostAsync($"{url}/LoadMessages", content).Result;
        statusCode = executionResult.StatusCode;
        if (statusCode == HttpStatusCode.Accepted)
        {
          file.Status = "Success";
        }
      }
      catch (Exception ex)
      {
      }
    }

1 ответ

Решение

Вот моя демонстрация:

Это интерфейсный документ службы:

https://i.stack.imgur.com/S0E0p.png

Это просьба:

       class Program
{
    
    static void Main(string[] args)
    {
        
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:8012/ServiceModelSamples/service/user");
        request.Method = "POST";
        request.ContentType = "application/json;charset=UTF-16";
        string Json = "{\"Email\":\"123\",\"Name\":\"sdd\",\"Password\":\"sad\"}";
        request.ContentLength = Encoding.UTF8.GetByteCount(Json);
        Stream myRequestStream = request.GetRequestStream();
        StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
        myStreamWriter.Write(Json);
        myStreamWriter.Close();

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        Stream myResponseStream = response.GetResponseStream();
        //myResponseStream.ResponseSoapContext
        StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
        string retString = myStreamReader.ReadToEnd();
        myStreamReader.Close();
        myResponseStream.Close();
        Console.WriteLine(retString);
        Console.ReadKey();

    }
}

https://i.stack.imgur.com/4THDq.gif

Не стесняйтесь сообщить мне, если проблема не исчезнет.

ОБНОВИТЬ

Определите класс Test:

       [DataContract]
    public class Test { 
    [DataMember]
    public string categoryid { get; set; }
    [DataMember]
    public string fileId { get; set; }
    }

реализация выглядит так:

       public void LoadMessages(Test test)
    {
  Test dataObject = OperationContext.Current.RequestContext.RequestMessage.GetBody<Test>(new DataContractJsonSerializer(typeof(Test)));
           Console.WriteLine(dataObject.categoryid);
 }
Другие вопросы по тегам