Почему мой метод POST не работает? - PullRequest
3 голосов
/ 17 июня 2011

У меня есть контракт на обслуживание WCF:

[ServiceContract]
public interface IVLSContentService
{
    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, UriTemplate = "GetCategoriesGET/{userIdArg}", BodyStyle = WebMessageBodyStyle.Bare)]
    List<Video> GetVideosGET(string userIdArg);

    [WebInvoke(Method = "POST",BodyStyle=WebMessageBodyStyle.Wrapped, UriTemplate = "submit")]
    [OperationContract]
    void SubmitVideoPOST(Video videoArg, string userId);
}

И у меня есть служба, которая выполняет контракт:

public class VLSContentService : IVLSContentService
{

    List<Video> catsForUser1 = new List<Video>();
    List<Video> catsForUser2 = new List<Video>();

    public List<Video> GetVideosGET(string userIdArg)
    {
        List<Video> catsToReturn = new List<Video>();

        if (Int32.Parse(userIdArg) == 1)
        {
            catsToReturn = catsForUser1;
        }
        else if (Int32.Parse(userIdArg) == 2)
        {
            catsToReturn = catsForUser2;
        }

        return catsToReturn;
    }


    public void SubmitVideoPOST(Video videoArg, string userId)
    {
        int i = 0;
    }
}

И у меня есть конфигурация:

  <system.serviceModel>

    <services>
      <service behaviorConfiguration="VLSContentServiceBehaviour" name="VLSContentService">
        <endpoint address="" behaviorConfiguration="VLSContentServiceEndpointBehaviour" binding="webHttpBinding" contract="IVLSContentService"/>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="VLSContentServiceBehaviour">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>

      <endpointBehaviors>
        <behavior name="VLSContentServiceEndpointBehaviour">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>

  </system.serviceModel>

И я пытаюсь вызвать операцию POST WCF со следующим клиентским кодом:

static void Main(string[] args)
{
    WebChannelFactory<IVLSContentService> cs = new WebChannelFactory<IVLSContentService>(new Uri("http://localhost:52587/Api/Content/VLSContentService.svc/SubmitVideoPOST"));
    IVLSContentService client = cs.CreateChannel();

    Video videoToAdd = new Video("My First Video");

    client.SubmitVideoPOST(videoToAdd,"1");

}

Но я получаю эту ошибку, и я не могу понять, почему:

Конечная точка не прослушивала http://localhost:52587/Api/Content/VLSContentService.svc/SubmitVideoPOST/submit что может принять сообщение. Это часто вызвано неправильным адресом или действие SOAP. Смотрите InnerException, если настоящее время, для более подробной информации.

Я знаю, когда я перехожу к методу GET в URL-адресе и передаю правильные параметры, я получаю обратно XML, но мой метод POST просто не работает. Я скопировал пример из pluralsight, с той лишь разницей, что вы пытаетесь разместить службу в файле .svc вместо приложения узла службы ...

Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

Похоже, у вас неверный адрес службы

Вы должны публиковать на http://localhost:52587/Api/Content/VLSContentService.svc/submit

UriTemplate относительно адреса конечной точки, равного

http://localhost:52587/Api/Content/VLSContentService.svc

Измените эту строку кода на

WebChannelFactory cs = new WebChannelFactory (new Uri ("http://localhost:52587/Api/Content/VLSContentService.svc/"));

3 голосов
/ 17 июня 2011

Вы, кажется, публикуете не по адресу. Ошибка показывает, что вы отправляете сообщение по относительному адресу "/ SubmitVideoPOST / submit", но ваш UriTemplate для этого метода просто "/ submit".

Вам не нужно включать имя метода .NET в URL для запросов на основе REST. Имеет значение только UriTemplate. Сопоставление с правильным методом выполнения выполняется для вас обработчиком WCF REST UriTemplate.

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