如何在C#中使用json wcf服务

时间:2013-02-18 21:32:55

标签: c# json wcf

我有一个json wcf。给出了地址。 wsdl中的代码具有以下内容:

<wsdl:binding name="BasicHttpBinding_iBOER" type="tns:iBOER">
 <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
 - <wsdl:operation name="PhoneCall">
 <soap:operation soapAction="http://tempuri.org/iBOER/PhoneCall" style="document" /> 
 - <wsdl:input>
 <soap:body use="literal" /> 
 </wsdl:input>
- <wsdl:output>
 <soap:body use="literal" /> 
 </wsdl:output>
 </wsdl:operation>

- <wsdl:service name="BOER">
- <wsdl:port name="BasicHttpBinding_iBOER" binding="tns:BasicHttpBinding_iBOER">
      <soap:address location="http://wsvc01/BOER/BOER.svc" /> 
  </wsdl:port>
  </wsdl:service>

如何在C#中使用它? 只是可以吗?

class Test
{
   static void Main()
   {
       iBOERClient client = new iBOERClient();

      // Use the 'client' variable to call operations on the service.

      // Always close the client.
      client.Close();
   }
}

我是否需要将URL放在客户端? 该服务有两个DataContract和许多DataMember。我对此并不坚强。

感谢。

1 个答案:

答案 0 :(得分:6)

您实际上没有JSON WCF服务。您有一个服务,可能有也可能没有可以接收/发送JSON数据的端点。您要显示的WSDL列出了一个使用基于SOAP的绑定(wsdl:port)的端点(BasicHttpBinding)。可以“谈话”JSON的端点使用WebHttpBinding定义,并且应用了一个特定行为(WebHttpBehavior) - 并且do not show up in the WSDL

因此,您无法使用由添加服务引用或svcutil.exe等工具生成的客户端来使用它。如果您在客户端代码中拥有相同的合同,则可以使用ChannelFactory<T>WebChannelFactory<T>等类创建代理以与服务进行通信,或者您可以手动处理请求并将其发送到使用通用HTTP客户端的服务。

下面的示例代码显示了如何使用WebChannelFactory<T>和“普通”HTTP客户端(WebClient)来使用JSON端点。

public class StackOverflow_14945653
{
    [DataContract]
    public class Person
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public int Age { get; set; }
        [DataMember]
        public Address Address { get; set; }
    }
    [DataContract]
    public class Address
    {
        [DataMember]
        public string Street;
        [DataMember]
        public string City;
        [DataMember]
        public string Zip;
    }
    [ServiceContract]
    public interface ITest
    {
        [WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        void RegisterPerson(Person p);
        [WebGet(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        Person FindPerson(string name);
    }
    public class Service : ITest
    {
        private static List<Person> AllPeople = new List<Person>();

        public void RegisterPerson(Person p)
        {
            AllPeople.Add(p);
        }

        public Person FindPerson(string name)
        {
            return AllPeople.Where(p => p.Name == name).FirstOrDefault();
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
        host.Open();
        Console.WriteLine("Host opened");

        Console.WriteLine("Accessing via WebChannelFactory<T>");
        WebChannelFactory<ITest> factory = new WebChannelFactory<ITest>(new Uri(baseAddress));
        ITest proxy = factory.CreateChannel();
        proxy.RegisterPerson(new Person
        {
            Name = "John Doe",
            Age = 32,
            Address = new Address
            {
                City = "Springfield",
                Street = "123 Main St",
                Zip = "12345"
            }
        });
        Console.WriteLine(proxy.FindPerson("John Doe").Age);
        Console.WriteLine();

        Console.WriteLine("Accessing via \"normal\" HTTP client");
        string jsonInput = "{'Name':'Jane Roe','Age':30,'Address':{'Street':'1 Wall St','City':'Springfield','Zip':'12346'}}".Replace('\'', '\"');
        WebClient c = new WebClient();
        c.Headers[HttpRequestHeader.ContentType] = "application/json";
        c.UploadString(baseAddress + "/RegisterPerson", jsonInput);

        c = new WebClient();
        Console.WriteLine(c.DownloadString(baseAddress + "/FindPerson?name=Jane Roe"));
        Console.WriteLine();

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}