WCF 405 веб-метод не найден проблема - PullRequest
0 голосов
/ 21 июля 2011

У меня есть требование создать веб-сервис, где клиент и сервис будут общаться в Simple Soap (этот запрос и ответ будут мылом), я пытался найти все примеры в сети, где это уже сделано, или некоторыепример кода, так что я могу начать, но я думаю, что плохо ищу Google, поэтому пока не могу найти никого, кто-то предложил использовать WCF, так что получите статью

http://csharping.com/wcf/building-a-soap-response-envelope-manually-with-the-message-class/

Но опять моя проблема не решена, я попытался создать приложение с этим примером (с таким количеством проблем :()

Создал консольное приложение и Program.cs is

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();
            }
        }
    }
}

app.config, который я сгенерировал с помощью svcutil.exe, выглядит так:

     <?xml version="1.0" encoding="utf-8"?>
        <configuration>
          <system.serviceModel>
            <bindings>
              <basicHttpBinding>
                <binding name="BasicHttpBinding_IService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                  <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                      maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                  <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                  </security>
                </binding>
              </basicHttpBinding>
            </bindings>
            <client>
              <endpoint address="http://localhost:2000/WebService/Service.svc"
                  binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
                  contract="IService" name="BasicHttpBinding_IService" />
            </client>
          </system.serviceModel>
        </configuration>

Моя веб-служба похожа (это веб-сайт 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);
    }

}

, а web.config

 <system.serviceModel>
    <services>
      <service behaviorConfiguration="ServiceBehavior" name="Service">
        <endpoint address="http://localhost:2000/WebService/Service.svc" binding="basicHttpBinding" bindingConfiguration=""
          contract="IService" >
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <timeouts closeTimeout="00:01:10" />
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpGetEnabled="true" policyVersion="Policy15" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Моя проблема 405 webmethod не может телокто-нибудь, пожалуйста, скажите мне, что является проблемой в этом,Я новичок в WCF до того, как создал этот образец, и это мое второе приложение

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Когда у вас есть служба WCF, суть в том, что вы можете определять, например, такие параметры, как строки, int и т. Д., И вам не придется связываться с множеством заголовков и тел XML и SOAP.

Таким образом, ваш контракт на обслуживание должен выглядеть примерно так:

[ServiceContract]
public interface IService
{
    [OperationContract]
    int DoSomeMathAddTowNumbers(int num1, int num2);
}

, и ваша реализация сервиса затем просто реализует этот метод, добавляет два числа и возвращает результат:

public class Service : IService
{
    int DoSomeMathAddTowNumbers(int num1, int num2)
    {
         return num1 + num2;  
    }
}

Не связывайтесь с Message, манипуляциями с XML или чем-либо еще.

Клиент, который хочет вызвать вашу службу, создаст прокси на стороне клиента WCF, используя svcutil или метод Visual Studio Add Service Reference, ион получит прокси-класс, который имеет те же методы, что и служба, к которой он подключается, - и вы бы назвали их, используя прямые, простые параметры - что-то вроде:

ServiceClient client = new ServiceClient();
int result = client.DoSomeMathAddTwoNumbers(42, 100);

Так что, в принципе, я думаю, что вам нужночтобы вернуться к чертежной доске и снова прочитать основы WCF - это должно быть , а не на самом деле так сложно!(в этом вся суть - это должно сделать услуги легкими ...)

Ознакомьтесь с Руководством для начинающих в Центре разработчиков WCF на MSDN - оно содержит множестводействительно хорошие видео, скринкасты, статьи о том, как начать работу с WCF .-

Возможно, вы также захотите посмотреть сериал DotNet Rocks TV № 135: Кит Элдер рассказывает о WCF

0 голосов
/ 21 июля 2011

Вам не нужно создавать SOAP-сообщение вручную, просто используйте базовое связывание http, и это вернет SOAP.

...