Не удается правильно настроить конечные точки WCF Restful / json - PullRequest
0 голосов
/ 25 марта 2020

Я создал спокойную службу и смог создать ответ JSON при получении XML запросов, но мне нужно было, чтобы он принимал JSON запросов. Я настроил процессы, но у меня были проблемы, потому что у меня изначально был основной сервис, вызывающий несколько сервисов, каждый со своим собственным C# интерфейсом. Он сказал мне, что я должен был явно назвать конечные точки, и все это пошло в кучу tra sh после этого. В конце концов я отказался от вызова нескольких служб и вместо этого перешел к одной службе с несколькими контрактами операций, вызывающими методы.

Теперь я просто получаю простое сообщение «конечная точка не найдена». Я действительно, действительно не понимаю все входы и выходы определений конечных точек.

Вот код на моей главной странице обслуживания (AgtDa sh .sv c). Мы вызываем статистику для «инструментальной панели агента»

EDIT - обновил код, чтобы отразить ссылку на шаблон URI, которая не была изменена, и изменил ссылку на имя службы в web.config. Теперь ошибка больше не «конечная точка не найдена», а ссылка 404.

namespace AgentDashboard
{

    public class AgtDash : dashboardInfo
    {

        public string GetAgencyInfo(agcInfoInput agcInput)
        {
            string agInfo = string.Empty;

            (RETRIEVES DATA TABLE)

            agInfo = tableToJson(agcTable);
            return agInfo;
        }

        public string GetAgencyDetails(agcInfoInput agcInput)
        {
            string agcyInfo = string.Empty;

            (RETRIEVES DATA TABLE)

            agcyInfo = tableToJson(agcTable);
            return agcyInfo;
        }

        public string GetAgencyTotals(agcInfoInput agcInput)
        {
            string agcyTot = string.Empty;

            (RETRIEVES DATA TABLE)

            agcyTot = tableToJson(agcTable);
            return agcyTot;
        }

        public string GetAgentTotals(agtInfoInput agtInput)
        {
            (RETRIEVES DATA TABLE)

                agtInfo = tableToJson(agTable);
            return agtInfo;
        }

        public string tableToJson(DataTable inpTable)
        {
            var jsString = new StringBuilder();

            (CONVERTS DATA TABLE TO JSON RESPONSE)

            return jsString.ToString();
        }
    }
}

Вот мой интерфейс:

namespace AgentDashboard
{
    [ServiceContract]
    public interface dashboardInfo
    {
        [OperationContract]
        [WebInvoke(UriTemplate="/GetAgentTotals",
            Method = "POST",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped)]

        string GetAgentTotals(agtInfoInput agentInput);

        [OperationContract]

        [WebInvoke(UriTemplate="/GetAgencyInfo",
            Method = "POST",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
               BodyStyle = WebMessageBodyStyle.Wrapped)]

        string GetAgencyInfo(agcInfoInput agencyInput);

        [OperationContract]

        [WebInvoke(UriTemplate="/GetAgencyDetails",
        Method = "POST",
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped)]

        string GetAgencyDetails(agcInfoInput agencyInput);

        [OperationContract]

        [WebInvoke(UriTemplate="/GetAgentTotals",
            Method = "POST",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped)]

        string GetAgencyTotals(agcInfoInput agencyInput);
    }


    [DataContract]
    public class agtInfoInput
    {
        [DataMember]
        public string id { get; set; }

        [DataMember]
        public int year { get; set; }

    }

    [DataContract]
    public class agcInfoInput
    {
        [DataMember]
        public int id { get; set; }

        [DataMember]
        public int year { get; set; }

    }
}

Моя веб-конфигурация:

<system.serviceModel>
    <client>
      <endpoint binding="webHttpBinding" contract="AgentDashboard.dashboardInfo" />
    </client>
    <services>
      <service name="AgentDashboard.AgtDash">
        <endpoint address="dashboardInfo" binding="webHttpBinding" behaviorConfiguration="webBehavior" contract="AgentDashboard.dashboardInfo" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="AgtDash.svc" />
          </baseAddresses>
        </host>       
      </service>
    </services>
    <bindings>
      <webHttpBinding>
        <binding>
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>      
    </behaviors>
  </system.serviceModel>

Я уверен, что web.config - это случайный беспорядок. Когда мне нужно определить сервис с подробными данными о конечной точке? Когда я использую конфигурацию клиента? Когда я использую оба? Казалось, что он работал локально нормально, когда у меня изначально было несколько клиентских конечных точек, но когда мне сказали, что я должен определить службу, я пошел по этому пути.

Извините, если есть ответы, но все они очень разные в решениях и не дают мне много понимания почему. В конечном итоге он будет находиться в своем собственном веб-приложении / каталоге, обслуживаемом IIS, и должен получать и отправлять JSON. Генерация ответа JSON, кажется, работает, она правильно идентифицирует конечные точки, что мешает мне полностью протестировать это, потому что я не могу правильно определить цель, так сказать.

Если что-то о web.config выскакивает на вас, дайте мне знать. Заранее спасибо.

ТЕКУЩАЯ ОШИБКА:

404ErrorCapture

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Нет необходимости определять дополнительные конечные точки обслуживания. В зависимости от вашей конфигурации, операция / методы должны иметь следующий вид:

Http://host:portnumber/AgtDash.svc/dashboardInfo/GetAgentTotals
Http://host:portnumber/AgtDash.svc/dashboardInfo/GetAgentInfo
Http://host:portnumber/AgtDash.svc/dashboardInfo/GetAgencyDetails   
Http://host:portnumber/AgtDash.svc/dashboardInfo/GetAgencyTotals.  

При вызове мы должны присоединить параметр в разделе Body с Post глаголом Http. База обслуживания, настроенная в Webconfig, может игнорироваться. Это определяется привязкой сайта IIS.
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.
Обновлено.
замените <service name="AgentDashboard.AgentDashInfo"> на <service name=”AgentDashboard.AgtDash”>. Здесь реализованный класс с пространством имен должен быть настроен.

1 голос
/ 25 марта 2020

Попробуйте добавить UriTemplate следующим образом:

      [OperationContract]
      [WebInvoke(UriTemplate="/GetAgentTotals",
      Method = "POST",
      RequestFormat = WebMessageFormat.Json,
      ResponseFormat = WebMessageFormat.Json,
      BodyStyle = WebMessageBodyStyle.Wrapped)]

      string GetAgentTotals(agtInfoInput agentInput)

Обратите внимание на UriTemplate с именем метода.

Это поможет клиенту найти правильное отображение операции.

Когда я делаю webHttpBinding, мне обычно нужно добавить UriTemplate.

ЗАКЛЮЧИТЕЛЬНЫЕ ЗАМЕЧАНИЯ:

Для преобразования существующего WCF в поддержку json, что хорошо ... Но для новых сервисов я бы просто использовал ASP. NET Core. У него гораздо лучшая поддержка JSON и многих других функций.

Особенно, если вам нужен только HTTP.

...