Http Post Format для WCF Restful Service - PullRequest
5 голосов
/ 25 декабря 2010

Привет, супер вопрос новичка. Рассмотрим следующую функцию WCF:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1
{
     private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

     [WebInvoke(UriTemplate = "", 
                Method = "POST", 
                ResponseFormat = WebMessageFormat.Json,
                RequestFormat = WebMessageFormat.Json,
                BodyStyle = WebMessageBodyStyle.Bare) ]
     public SomeObject DoPost(string someText)
     {
          ...
          return someObject;

В fiddler, как будут выглядеть заголовки и тело моего запроса?

Спасибо за помощь.

Ответы [ 4 ]

16 голосов
/ 25 декабря 2010

Я немного изменил ваш сервис WCF, чтобы иметь лучший пример, и написал пример тестовой программы (см. Ниже).

Первый тест выполняет запрос GET для URL http://localhost:57211/Service1.svc/getcar/1. 1 в конце - это параметр.Номер порта может отличаться в вашем случае.Результат:

{"ID":1,"Make":"Porsche"}

Второй тест выполняет запрос POST, отправляя те же данные (кроме Ferrari для Porsche) на URL http://localhost:57211/Service1.svc/updatecar/1. Результат:

{"ID":1,"Make":"Ferrari"}

У этого запроса есть и параметр в URL ( 1 ), и данные запроса (структура JSON) в качестве второго параметра, передаваемые как тело запроса.

С помощьюсетевой отладчик, это будет выглядеть так (упрощенно):

POST /Service1.svc/updatecar/1 HTTP/1.1
Host: localhost:57211
Content-Type: application/json
Content-Length: 25

{"ID":1,"Make":"Ferrari"}

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Sat, 25 Dec 2010 19:16:19 GMT
Content-Length: 25
Content-Type: application/json; charset=utf-8

{"ID":1,"Make":"Ferrari"}

Надеюсь, это поможет.

TestService.cs:

class TestService
{
    static void Main(string[] args)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:57211/Service1.svc/getcar/1");
        WebResponse response = request.GetResponse();
        string result = new StreamReader(response.GetResponseStream()).ReadToEnd();
        Console.WriteLine(result);

        string requestData = "{\"ID\":1,\"Make\":\"Ferrari\"}";
        byte[] data = Encoding.UTF8.GetBytes(requestData);
        request = (HttpWebRequest)WebRequest.Create("http://localhost:57211/Service1.svc/updatecar/1");
        request.Method = "POST";
        request.ContentType = "application/json";
        Stream dataStream = request.GetRequestStream();
        dataStream.Write(data, 0, data.Length);
        dataStream.Close();

        response = request.GetResponse();
        result = new StreamReader(response.GetResponseStream()).ReadToEnd();
        Console.WriteLine(result);
    }
}

IService.cs:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "/getcar/{id}")]
    Car GetCar(string id);

    [OperationContract]
    [WebInvoke(RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "/updatecar/{id}")]
    Car UpdateCar(string id, Car car);
}


[DataContract]
public class Car
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string Make { get; set; }
}

Service.svc:

public class Service1 : IService1
{
    public Car GetCar(string id)
    {
        return new Car { ID = int.Parse(id), Make = "Porsche" };
    }


    public Car UpdateCar(string f, Car car)
    {
        return car;
    }
}

Service1.svc (разметка):

<%@ ServiceHost Language="C#" Debug="true" Service="JSONService.Service1" CodeBehind="Service1.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
1 голос
/ 26 декабря 2010
DataContractJsonSerializer serializer = new DataContractJsonSerializer(MyClass.GetType());
MemoryStream ms = new MemoryStream();

serializer.WriteObject(ms, MyClass);
string JsonString =  Encoding.Default.GetString(ms.ToArray());

Запустите приведенный выше код, узнайте, как выглядит JSON ... где MyClass - объект любого класса

1 голос
/ 25 декабря 2010

json - это не что иное, как строка, которая может быть легко использована ajax или java-скриптом. для других языков, таких как c #, вы можете преобразовать эту строку в пользовательский класс, просто написав простую логику и по умолчанию перезапустите wcf, десериализуя данные в json

0 голосов
/ 25 декабря 2010

Я предполагаю, что часть информации, которую вам не хватает, - это то, что WCF передает туда и обратно сериализованные объекты.Вопрос в том, как выглядит сериализованный строковый объект JSON.Никогда не использовал JSON с WCF, я не могу вам сказать.

Однако я могу предложить, если вы попытаетесь передать someObject2 вместо someText, у вас, вероятно, будет больше успеха.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...