【问题标题】:Http Post Format for WCF Restful ServiceWCF Restful 服务的 Http Post 格式
【发布时间】:2011-05-30 15:11:10
【问题描述】:

嘿,超级新手的问题。考虑以下 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;

在提琴手中,我的请求标头和正文会是什么样子?

感谢您的帮助。

【问题讨论】:

    标签: c# wcf http rest


    【解决方案1】:

    我猜您缺少的信息是 WCF 来回传递序列化对象。问题是,JSON 序列化的字符串对象是什么样的。从来没有在 WCF 中使用过 JSON,我不能告诉你。

    但是,我可以建议,如果您尝试传递 someObject2 而不是 someText,您可能会获得更大的成功。

    【讨论】:

      【解决方案2】:

      json 只不过是一个可以被 ajax 或 java 脚本轻松使用的字符串。对于像 c# 这样的其他语言,您只需编写一个简单的逻辑即可将此字符串自定义为自定义类。默认情况下,restfull wcf 将数据反序列化为 json

      【讨论】:

        【解决方案3】:

        我稍微更改了您的 WCF 服务以提供更好的示例并编写了示例测试程序(见下文)。

        第一个测试对 URL http://localhost:57211/Service1.svc/getcar/1 执行 GET 请求。末尾的 1 是一个参数。在您的情况下,端口号可能会有所不同。结果是:

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

        第二个测试通过将相同的数据(除了 Ferrari for Porsche)发送到 URL http://localhost:57211/Service1.svc/updatecar/1 来执行 POST 请求。结果是:

        {"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" %>
        

        【讨论】:

          【解决方案4】:
          DataContractJsonSerializer serializer = new DataContractJsonSerializer(MyClass.GetType());
          MemoryStream ms = new MemoryStream();
          
          serializer.WriteObject(ms, MyClass);
          string JsonString =  Encoding.Default.GetString(ms.ToArray());
          

          运行上面的代码,就会知道 JSON 的样子...其中MyClass 是任何类的对象

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-07-11
            • 2011-09-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多