Конечная точка не найдена — веб-служба WCF

Я создал 2 конечные точки для службы WCF.

Он отлично работает с basicHttpBinding, но вызывает ошибку для webHttpBinding.

Ошибка = конечная точка не найдена.

Определение операционного контракта

[OperationContract]
[WebInvoke(Method = "POST",
           BodyStyle = WebMessageBodyStyle.WrappedRequest,
           ResponseFormat = WebMessageFormat.Json)]
VINDescription CallADSWebMethod(string vin, string styleID);

web.config:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="Description7aBinding" 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://services.chromedata.com:80/Description/7a"
                binding="basicHttpBinding"
                bindingConfiguration="Description7aBinding"
                contract="description7a.Description7aPortType"
                name="Description7aPort"/>
    </client>
    <services>
      <service behaviorConfiguration="asmx" name="ADSChromeVINDecoder.Service">
        <endpoint name="httpEndPoint" 
                  address="" 
                  binding="basicHttpBinding"
                  contract="ADSChromeVINDecoder.IService"/>
        <endpoint name="webEndPoint"
                  address="json"
                  behaviorConfiguration="web"
                  binding="webHttpBinding"
                  contract="ADSChromeVINDecoder.IService"/>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
          <enableWebScript/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="asmx">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>

Пожалуйста, предложите мне, как я могу это исправить?


person James    schedule 15.10.2012    source источник
comment
Как вы получаете ошибку «Конечная точка не найдена»? На какой адрес отправить запрос?   -  person carlosfigueira    schedule 15.10.2012
comment
при нажатии - localhost:55410/Service.svc/json в браузере   -  person James    schedule 15.10.2012
comment
Пожалуйста, дайте мне знать, если я должен добавить какой-то другой код.   -  person James    schedule 15.10.2012
comment
localhost:55410/Service.svc - все работает нормально... Приходит ошибка - localhost:55410/Service.svc/json   -  person James    schedule 15.10.2012
comment
VINDescription = класс DataContract   -  person James    schedule 15.10.2012
comment
ADSChromeVINDecoder = Название решения   -  person James    schedule 15.10.2012
comment
Эта ссылка работает? http://localhost:55410/Service.svc/json/help   -  person Yuriy Rozhovetskiy    schedule 15.10.2012
comment
..json/help = Это тоже дает ту же конечную точку, которая не найдена. ошибка   -  person James    schedule 15.10.2012
comment
localhost:55410/help попробуйте это   -  person MMK    schedule 15.10.2012
comment
localhost:55410/help = Ресурс не найден. localhost:55410/service.svc/help = HTTP 400 Неверный запрос   -  person James    schedule 15.10.2012
comment
Попробуйте указать относительный адрес для обеих конечных точек   -  person MMK    schedule 15.10.2012
comment
@MMK Я дал -- ‹имя конечной точки=httpEndPoint address=test binding=basicHttpBinding Contract=ADSChromeVINDecoder.IService/› ‹endpoint name=webEndPoint address=json behaviorConfiguration=web binding=webHttpBinding Contract=ADSChromeVINDecoder.IService/› и протестировал... но та же проблема с конечной точкой   -  person James    schedule 15.10.2012
comment
С каким фреймворком вы работаете? Также как вы размещаете свой сервис WCF?   -  person Rajesh    schedule 15.10.2012
comment
Framework 4.0 и размещение IIS.   -  person James    schedule 15.10.2012


Ответы (1)


Я создал сервис, аналогичный тому, что у вас есть, в соответствии с этим:

 [ServiceContract]
public interface IService
{
    [OperationContract]
    [WebInvoke(UriTemplate="/CallADSWebMethod", Method="POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
    string CallADSWebMethod(string vin, string styleID);
}

Важной вещью, которую я добавил, была часть UriTemplate, которая сообщает сервису, как должен выглядеть вызов. Затем я реализовал эту службу как:

public class Service : IService
{
    public string CallADSWebMethod(string vin, string styleID)
    {
        return vin + styleID;
    }
}

и в моем web.config у меня есть следующее:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="Description7aBinding" 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>
<services>
  <service behaviorConfiguration="asmx" name="WebApplication1.Service">
    <endpoint address="basic" binding="basicHttpBinding" name="httpEndPoint" contract="WebApplication1.IService"/>
    <endpoint address="json" binding="webHttpBinding" behaviorConfiguration="webBehavior" name="webEndPoint" contract="WebApplication1.IService"/>
    <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
  </service>
</services>
<behaviors>
    <endpointBehaviors>
        <behavior name="webBehavior">
            <webHttp />
        </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
    <behavior name="asmx">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>

I have then created a simple page that looks like this that calls this service using jQuery:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $("#Ok").click(function () {
                var jData = {};
                jData.vin = "one";
                jData.styleID = "test";
                $.ajax({
                    type: "POST",
                    url: "/Service.svc/json/CallADSWebMethod",
                    data: JSON.stringify(jData),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (msg) {
                        alert(msg);
                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                        alert(textStatus);
                    }
                });
            });
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input type="button" id="Ok" name="Ok" value="Ok" />
    </div>
    </form>
</body>
</html>

и это создает предупреждение с текстом onetest. Надеюсь, это может дать некоторое руководство.

person Johan Lundqvist    schedule 15.10.2012
comment
Теперь он работает. Я заметил здесь 3 вещи: 1: UriTemplate=/CallADSWebMethod 2: добавление привязки = mexHttpBinding 3: данные: JSON.stringify(jData), чего я не делал. Не могли бы вы добавить немного света на них. - person James; 16.10.2012
comment
1. Шаблон UriTemplate просто сопоставляет URI или набор URI с операцией службы, т. е. с тем, как можно вызвать службу. 2. Эта привязка просто добавляет возможность доступа к WSDL. 3. Это функция для преобразования объекта в строку json, пригодную для использования в вызове ajax, просто ярлык, вы можете сделать это самостоятельно, но это удобно. - person Johan Lundqvist; 16.10.2012
comment
Делает ли это обработку быстрее, если я также JSON.stringify ответ, исходящий от вызова? - person James; 16.10.2012
comment
Обработка не будет быстрее, и, поскольку вы получаете строку json, вы не можете использовать JSON.stringify, вы можете использовать JSON.parse(jsontext) в этом случае. - person Johan Lundqvist; 16.10.2012
comment
В настоящее время он работает нормально. Есть ли какая-либо польза от использования JSON.parse в любом случае. - person James; 16.10.2012
comment
Теперь все работает. Но вдруг я получаю эту ошибку для - JSON.stringify () - AS JSON не определен. Он подходит только для всех версий IE... Можете ли вы пролить свет на это . - person James; 18.10.2012
comment
Он поддерживается IE › 7, см. msdn.microsoft. .com/en-us/library/cc836459%28VS.85%29.aspx - person Johan Lundqvist; 18.10.2012
comment
Я тестировал в IE8 и 9, но там была ошибка. Итак, что я сделал, так это сделал строку в формате JSON самостоятельно, а не с помощью функции.. и я был спасен.. - person James; 19.10.2012