WCF REST Вопрос, Связывание, Конфигурация - PullRequest
3 голосов
/ 19 мая 2010

Я работаю над интерфейсом отдыха WCF, используя json. Я поместил службу в службу Windows для размещения службы, но теперь у меня возникают проблемы с вызовом службы. Я не уверен точно, что не так.

Основная идея заключается в том, что я хочу разместить службу на удаленном сервере, поэтому я хочу, чтобы служба была сопоставлена ​​с портом localhost: 7600, чтобы его можно было вызвать, отправив данные на [server_ip]: 7600. Скорее всего, проблема в файле конфигурации, так как я новичок в WCF и Rest, я не был уверен, что печатать для конфигурации, так что извините, если это полный беспорядок.

Я удалил несколько фрагментов кода и комментариев, чтобы его было легче читать. Эти функции не должны иметь отношения к сервису, поскольку они вызывают только функции C #.

РЕДАКТИРОВАТЬ: Я посмотрел предложенный пост и переписал код, но, к сожалению, он все еще не работает. Мэйби, я просто использую неправильный адрес, ты бы вызвал это с http://localhost:7600, верно?

РЕДАКТИРОВАТЬ: Спасибо, ребята за вашу помощь. Проблема заключалась в том, что вы не можете использовать ServiceHost со свойством, которое использует UriTemplate. Так что, если я уберу это, сервис по крайней мере на полпути работает. Я все еще застрял на одной части, хотя. Служба должна вызываться через HTTP-запросы, которые вы можете создавать с помощью Fiddler. Есть идеи, как мне это сделать?

РЕДАКТИРОВАТЬ: NVM, это был глупый вопрос. Отправьте данные на http://localhost:7600/PCMiler_Connect_Imple, и это вернет данные json. Еще раз спасибо, ребята.

РЕДАКТИРОВАТЬ: Так что это было бы более полезно для кого-то еще с такой же проблемой, я добавил код, как это сейчас, с примером вызова json.

Сервисный интерфейс WCF

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Data;

namespace PCMiler_Service
{
    [ServiceContract]
    public interface IPCMiler_Connect
    {
        [WebInvoke(Method = "POST",
                   ResponseFormat = WebMessageFormat.Json,
                   RequestFormat = WebMessageFormat.Json), //code corrected
        OperationContract]
        List<string> PCMiler_Connect_Imple(ZIP_List_Container container);
    }
}

Реализация службы WCF

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace PCMiler_Service
{
    [DataContract]
    public class ZIP_List_Container
    {
        [DataMember]
        public string[] ZIP_List { get; set; }
        [DataMember]
        public string Optimized { get; set; }
        [DataMember]
        public string Calc_Type { get; set; }
        [DataMember]
        public string Cross_International_Borders { get; set; }
        [DataMember]
        public string Use_Kilometers { get; set; }
        [DataMember]
        public string Hazard_Level { get; set; }
        [DataMember]
        public string OK_To_Change_Destination { get; set; }
    }

    public class PCMiler_Connect : IPCMiler_Connect
    {
        public List<string> PCMiler_Connect_Imple(ZIP_List_Container container)
        {
            return container.ZIP_List.ToList<string>();
        }
    }
}

XML Config File

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="PCMiler_Service.PCMiler_ConnectBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
          <endpointBehaviors>
            <behavior name="jsonBehavior"  >
              <enableWebScript />
            </behavior>
          </endpointBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="PCMiler_Service.PCMiler_ConnectBehavior"
                name="PCMiler_Service.PCMiler_Connect">
              <endpoint address="" behaviorConfiguration="jsonBehavior" binding="webHttpBinding"
                  contract="PCMiler_Service.IPCMiler_Connect" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:7600/" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>
</configuration>

Сервисный упаковщик

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.ServiceModel;
using System.Text;
using System.Threading;

namespace PCMiler_Service
{
    public partial class PCMiler_Service : ServiceBase
    {
        ServiceHost host;
        Thread thread;

        public PCMiler_Service()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            host = new ServiceHost(typeof(PCMiler_Connect));
            host.Open();
        }

        protected override void OnStop()
        {
            if (host != null)
            {
                host.Close();
                host = null;
            }
        }
    }
}

Пример JSON POST с HTTP

POST /PCMiler_Connect_Imple HTTP/1.1
HOST: localhost:7600
Content-Type: application/json
Content-Length: 84

{
     "container": {
                    "ZIP_List":["29340","29614"]
      }
}

Ответы [ 2 ]

0 голосов
/ 19 мая 2010

Я думаю, вам нужно использовать WebServiceHost вместо ServiceHost.

0 голосов
/ 19 мая 2010

Наверное, глупый вопрос, но ... Где твой интерфейс?

Если вы читаете это ...

http://weblogs.asp.net/ralfw/archive/2007/04/14/a-truely-simple-example-to-get-started-with-wcf.aspx

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

Это, однако, не похоже на ваш типичный сервис WCF, скорее на обычный добрый старомодный сервис Windows, который не являетсяСлужба WCF (как вы должны видеть по этой ссылке), однако, похоже, что вы уже использовали некоторые компоненты WCF (например, атрибуты контракта).

Я думаю, что ваша проблема в том, что вы пропустили объявление интерфейса.что WCF требует этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...