Почему я получаю 400 и 405 исключений с моим клиентским приложением WCF RESTful с PUT и POST? - PullRequest
1 голос
/ 09 декабря 2010

Я создаю приложение с настройкой двух серверов - сервера «служб» и сервера «переднего плана».Сервер "Службы" имеет службу WCF.«Внешний» сервер имеет традиционное приложение веб-форм ASP.NET, которое обращается к службе WCF.Я могу заставить запросы GET работать нормально.Однако я не могу заставить работать какие-либо запросы PUT или POST.Когда я пытаюсь выдать POST, я получаю исключение 400 - Bad Request.Когда я пытаюсь выдать PUT, я получаю исключение 405 - Метод не разрешен.Я чувствую, что у меня все настроено правильно - но, очевидно, нет.Вот код для моей службы WCF:

Service.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="TestSvc" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

TestSvc.cs:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceContract]
public class TestSvc
{
    [WebGet(UriTemplate="/")]
    [OperationContract]
    public Users GetUsers() 
    { ...code to get all users from database }

    [WebInvoke(UriTemplate = "/", Method = "POST")]
    [OperationContract]
    public void AddUser(User user) 
    { ...code to add user to database }

    [WebInvoke(UriTemplate = "/{id}", Method = "PUT")]
    [OperationContract]
    public void UpdateUser(string id, User user) 
    { ...code to update user in database }

    [WebGet(UriTemplate = "/{id}")]
    [OperationContract]
    public User GetUser(string id) 
    { ...code to get a single user from database }
}

(Кроме того, у меня есть классы для пользователяи пользователи лиц)

Затем на внешнем интерфейсе у меня есть этот интерфейс:

[ServiceContract]
interface ITestService
{
    [WebGet(UriTemplate = "/")]
    [OperationContract]
    Users GetUsers();

    [WebInvoke(UriTemplate = "/", Method = "POST")]
    [OperationContract]
    void AddUser(User user);

    [WebInvoke(UriTemplate = "/{id}", Method = "PUT")]
    [OperationContract]
    void UpdateUser(string id, User user);

    [WebGet(UriTemplate = "/{id}")]
    [OperationContract]
    User GetUser(string id);
}

И затем у меня есть этот вспомогательный класс:

public class ServiceClient
{
    WebChannelFactory<ITestService> cf;
    ITestService channel;

    public ServiceClient()
    {
        cf = new WebChannelFactory<ITestService>(new Uri("http://myserver/service.svc"));
        channel = cf.CreateChannel();
    }

    public Users GetUsers()
    { return channel.GetUsers(); }

    public User GetUser(string id)
    { return channel.GetUser(id); }

    public void AddUser(User user)
    { channel.AddUser(user); }

    public void UpdateUser(string id, User user)
    { channel.UpdateUser(id, user); }
}

И, наконец, воткак выглядит код на моей странице, который пытается выполнить обновление объекта User.

    protected void btnSave_Click(object sender, EventArgs e)
    {
        User _user = new User(Convert.ToInt32(txtID.Value), txtFirstName.Text, txtLastName.Text, Convert.ToInt32(txtAge.Text), chkIsRegistered.Checked);
        ServiceClient _client = new ServiceClient();
        _client.UpdateUser(txtID.Value, _user);
        Response.Redirect("~/ViewUsers.aspx");
    }

Когда я запускаю интерфейсный проект и пытаюсь выполнить обновление, я получаю следующую ошибку:

Удаленный сервер возвратил неожиданный ответ: (405) Метод не разрешен.

Есть идеи?Спасибо, Кори

Ответы [ 2 ]

0 голосов
/ 10 декабря 2010

Я решил часть проблемы. Я удалил модуль WebDav в IIS для сайта, а затем PUT начал работать. (Я думаю, что это связано с WebDav, обрабатывающим глаголы PUT и DELETE) Однако глагол POST не работает. Он возвращает ошибку 400 Bad Request. Я попытаюсь решить это в отдельном вопросе.

0 голосов
/ 09 декабря 2010

Сколько данных вы отправляете? У меня были проблемы со службами WCF при отправке более 64 Кб за раз (при конфигурации по умолчанию вы можете увеличить ее). POST обычно возвращает 400 в этом случае, но я не знаю, что вернет PUT, так как моя служба не использует PUT.

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