WCF 405 webmethod未找到问题
我有一个创建一个Web服务的要求,客户机和服务将在简单的Soap中进行对话(请求和响应将是Soap),我尝试在网络上找到一个已经完成了这项工作的示例或一些代码示例,这样我就可以开始了,但我认为我在搜索google方面不好,这就是为什么到目前为止找不到任何一个,有人建议使用WCF以便获得一篇文章 但是我的问题仍然没有解决,我尝试用这个示例创建一个应用程序(有这么多问题:() 创建了一个控制台应用程序,并且Program.csWCF 405 webmethod未找到问题,wcf,web-services,http-status-code-405,Wcf,Web Services,Http Status Code 405,我有一个创建一个Web服务的要求,客户机和服务将在简单的Soap中进行对话(请求和响应将是Soap),我尝试在网络上找到一个已经完成了这项工作的示例或一些代码示例,这样我就可以开始了,但我认为我在搜索google方面不好,这就是为什么到目前为止找不到任何一个,有人建议使用WCF以便获得一篇文章 但是我的问题仍然没有解决,我尝试用这个示例创建一个应用程序(有这么多问题:() 创建了一个控制台应用程序,并且Program.cs using System; using System.IO; usin
using System;
using System.IO;
using System.Net;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.Text;
using System.Runtime.Serialization;
namespace ServiceConsole
{
public class Program
{
static void Main(string[] args)
{
using (ServiceHost serviceHost = new ServiceHost(typeof(ServiceClient), new Uri("http://localhost:2000/")))
{
ServiceEndpoint serviceEndpoint = new ServiceEndpoint(
ContractDescription.GetContract(typeof(IService)));
ServiceEndpoint metadataEndpoint = new ServiceEndpoint(
ContractDescription.GetContract(typeof(IMetadataExchange)));
ServiceMetadataBehavior metadataBehavior = serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (metadataBehavior == null)
{
metadataBehavior = new ServiceMetadataBehavior();
metadataBehavior.HttpGetEnabled = true;
serviceHost.Description.Behaviors.Add(metadataBehavior);
}
serviceHost.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "http://localhost:2000/");
serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "http://localhost:2000/WCFService/mex");
serviceHost.Open();
string requestData = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header><h:HeaderItem xmlns:h=\"http://tempuri.org/\">a header item</h:HeaderItem><ActivityId CorrelationId=\"090c553b-bfcc-4e4f-94cd-1b4333fe82a9\" xmlns=\"http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics\">377a454b-b543-4c6f-b4ac-3981029b60e6</ActivityId></s:Header><s:Body><string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">a body item</string></s:Body></s:Envelope>";
byte[] requestDataBytes = Encoding.UTF8.GetBytes(requestData);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/WCFService/");
request.Method = "POST";
request.ContentType = "text/xml; charset=utf-8";
request.Headers.Add("SOAPAction", "http://tempuri.org/IWebService/GetMessage");
request.ContentLength = requestDataBytes.Length;
StreamWriter streamWriter = new StreamWriter(request.GetRequestStream());
streamWriter.Write(requestData);
streamWriter.Flush();
streamWriter.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
string responseBody = streamReader.ReadToEnd();
Console.WriteLine("Service returned the following response...");
Console.WriteLine("");
Console.WriteLine(responseBody);
Console.ReadKey();
serviceHost.Close();
}
}
}
}
我的WebServiceOCE类似于(它是一个WCF网站,其中端口由我提供,是2000)
服务合同是
[ServiceContract]
public interface IService
{
[OperationContract]
Message GetMessage(Message s);
}
[ServiceBehavior]
public class Service : IService
{
public Message GetMessage(Message message)
{
string body = message.GetBody<string>();
return Message.CreateMessage(MessageVersion.Soap11, "http://tempuri.org/IWebService/GetMessageResponse", "body is " + body);
}
我的问题是405 webmethod not body任何人都可以告诉我这是什么问题,在创建示例之前我是WCF新手,这是我的第二个应用程序您不需要手动创建SOAP消息,只需使用基本http绑定,这将重新启动SOAP。当您有WCF服务时,关键是您可以例如,定义字符串、int等参数,这样就不必处理大量的XML和SOAP头和体 因此,基本上,您的服务合同应该是:
[ServiceContract]
public interface IService
{
[OperationContract]
int DoSomeMathAddTowNumbers(int num1, int num2);
}
ServiceClient client = new ServiceClient();
int result = client.DoSomeMathAddTwoNumbers(42, 100);
然后,您的服务实现只需实现该方法,将两个数字相加,然后返回结果:
public class Service : IService
{
int DoSomeMathAddTowNumbers(int num1, int num2)
{
return num1 + num2;
}
}
不要弄乱消息
或XML操作或任何东西
想要调用您的服务的客户端将使用svcuti
或Visual Studio添加服务引用
方法创建一个WCF客户端代理,它将获得一个代理类,该类与它连接的服务具有相同的方法-您可以使用简单明了的参数调用它们-类似于:
[ServiceContract]
public interface IService
{
[OperationContract]
int DoSomeMathAddTowNumbers(int num1, int num2);
}
ServiceClient client = new ServiceClient();
int result = client.DoSomeMathAddTwoNumbers(42, 100);
因此,基本上,我认为你需要回到绘图板上,再次阅读WCF的基础知识-它应该不是那么难,真的!(这就是全部要点-它应该使服务更容易。)
查看MSDN上的内容-它包含了很多非常好的视频、屏幕广播和关于如何开始使用WCF的文章-
您可能还想查看DotNet Rocks电视插曲#135:任何我可以测试它的示例,请看看客户请求如何,感谢ResponseAnks的回复,创建这样的东西并不困难,有数百个示例可用,但要求是传递saop消息而不是int或双传递soap和get soap,我也会查看这段视频,感谢link和replyWCF服务正在传递SOAP消息!…但您不必自己手动组装这些消息-WCF运行时将在幕后为您完成此操作…如果我们必须这样做,我们可以这样做吗?或者不,我不知道将使用我的Web服务的客户端是什么我很抱歉,我忘记了我问题的重要部分…@share:没关系-只要客户端可以使用SOAP,您的WCF服务就可以正常工作-使用
int
和string
参数以及所有这些优点…真的:不需要在客户端上手动构造SOAP消息,也不需要dea在服务器上使用原始SOAP消息!