您实际上并没有 JSON WCF 服务。您有一个服务,它可能有也可能没有可以接收/发送 JSON 数据的端点。您显示的 WSDL 列出了使用基于 SOAP 的绑定 (BasicHttpBinding) 的端点 (wsdl:port)。可以“交谈”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();
}
}