Получение ошибки http 400 при вызове спокойной службы wcf с использованием сообщения http - PullRequest
0 голосов
/ 25 августа 2009

Я настроил службу wcf. К сожалению, когда я звоню в службу через Fiddler, Интернет или где-то еще, я получаю ошибку http 400. Я действительно озадачен тем, с чего начать решать эту проблему. Любые предложения приветствуются. WSDL не вариант в настоящее время. ОТДЫХ является требованием. Я мог совершать вызовы ранее, используя GET, однако получение не является безопасным, поскольку мне нужно передать идентификатор пользователя и пароль для проверки, и это было бы легко просмотреть.

Служба wcf имеет следующий интерфейс:

    [WebInvoke(UriTemplate = "/Login", Method="POST", 
        ResponseFormat = WebMessageFormat.Xml, 
        BodyStyle = WebMessageBodyStyle.Wrapped)]
    [OperationContract]
    bool Login(string UserName, string PassWord, string AppKey);

Сервис имеет следующий код. да, этот код неполон, и я знаю, что AppKey на самом деле ничего не делает, он здесь как заполнитель.

    public bool Login(string UserName, string PassWord, string AppKey)
    {
        bool bl = false;
        if (String.IsNullOrEmpty(AppKey))
        {
            throw (new ApplicationException(AppKeyNull));
        }
        if (Membership.ValidateUser(UserName, PassWord))
        {
            bl = true;
        }
        return (bl);
    }

Я пытаюсь позвонить в службу через скрипач. У меня есть следующий URL:

http://127.0.0.1:82/WebServices/RemoteAPI.svc/Login

У меня есть следующие настройки заголовка:

User-Agent: Fiddler
Host: 127.0.0.1:82
Content-Length: 46
Content-Type: application/x-www-form-urlencoded

У меня есть следующие настройки тела:

UserName=xxxxxx&PassWord=yyyyyy&AppKey=blah

Ответы [ 5 ]

2 голосов
/ 25 августа 2009

Попробуйте:

Измените подпись и атрибуты вашего метода на

[WebInvoke(UriTemplate = "/Login", Method = "POST", ResponseFormat = WebMessageFormat.Xml, RequestFormat= WebMessageFormat.Xml)]
[OperationContract]
bool Login(LoginContract loginInfo);

Затем добавьте новый контракт данных LoginContract

[DataContract]
public class LoginContract
{
    [DataMember]
    public string UserName { get; set; }

    [DataMember]
    public string PassWord { get; set; }

    [DataMember]
    public string AppKey { get; set; }

}

Тогда при публикации с Fiddler укажите Content-Type: text/xml

и используйте это как тело запроса

<LoginContract xmlns="http://schemas.datacontract.org/2004/07/YourAppName" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<AppKey>blah</AppKey>
<PassWord>testpwd</PassWord>
<UserName>test</UserName></LoginContract>

В качестве альтернативы, если вы хотите использовать JSON в качестве тела запроса, измените RequestFormat = WebMessageFormat.JSON и передайте его как тело запроса

{ "AppKey": "blah", "PassWord": "testpwd", "UserName": "test" }
0 голосов
/ 11 августа 2010
User-Agent: Fiddler
Host: localhost:8889
Content-Length: 113
**Content-Type: text/xml**

Проверить, отсутствует ли «Content-Type» в заголовке запроса?

0 голосов
/ 25 августа 2009

Это допустимый формат данных для передачи в службу REST?

Я могу только предположить, что вы используете это: http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute.aspx

И вы не указываете RequestFormat, который поддерживает XML и JSON. Ваше тело не является ни JSON, ни XML.

0 голосов
/ 25 августа 2009

Проверьте WCF REST Contrib за помощь в этом. Или вы можете принять параметр Stream в своем методе реализации и использовать утилиту HttpUtility.ParseQueryString для анализа значений строки запроса из тела POSTed.

0 голосов
/ 25 августа 2009

Ошибка 400 может произойти, если Content-Length немного отключен, если вы по какой-то причине рассчитываете его самостоятельно. Может потребоваться дополнительная информация, например полный текст http-запроса.

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