Помогите с простой проблемой успокоительного поста - PullRequest
2 голосов
/ 11 ноября 2010

Я новичок в сфере спокойных сервисов и создаю серию простых консольных приложений для лучшего понимания.У меня есть простой сервис, на который я пытаюсь отправить данные, но получаю ошибку 400 неверных запросов.Я знаю, что это должно быть что-то простое, что я упустил из виду.Любая помощь будет принята с благодарностью.Спасибо

//service contract
[OperationContract, WebInvoke(Method = "POST", UriTemplate = "Test")]
bool Test(string input);

//service
public bool Test(string input)
{
   Console.Out.WriteLine("recieved [" + input + "]");
   return true;
}

//host program
class Program
{
    static void Main(string[] args)
    {
        Uri baseAddress = new Uri("http://localhost:8889/TestImage");
        WebServiceHost host = new WebServiceHost(typeof(ImageTestService), baseAddress);

        try   
        {   
            host.Open();

            Console.Out.WriteLine("TestService hosted at {0}", baseAddress.ToString());
            Console.Out.WriteLine("hit enter to terminate");
            Console.In.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.ReadKey();
        }
        finally
        {
            if (host.State == CommunicationState.Faulted)
                host.Abort();
            else
                host.Close();
        }   
    }
}

//client program
// Create the web request
Uri address = new Uri("http://localhost:8889/TestImage/Test");
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;

// Set type to POST   
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";

StringBuilder data = new StringBuilder();
data.Append("input=" + HttpUtility.UrlEncode("12345"));

// Create a byte array of the data we want to send   
byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString());

// Set the content length in the request headers   
request.ContentLength = byteData.Length;

// Write data   
using (Stream postStream = request.GetRequestStream())
{
   postStream.Write(byteData, 0, byteData.Length);
   postStream.Close();
}

// Get response   
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
   // Get the response stream   
   StreamReader reader = new StreamReader(response.GetResponseStream());
}

Ответы [ 3 ]

0 голосов
/ 11 ноября 2010

К сожалению, я не уверен, что не так с вашим кодом, на первый взгляд все выглядит хорошо. Интересно, это UriTemplate, который вы используете. Если ваш метод «Test», а UriTemplate - «Test», вам может потребоваться вызвать его с этим URL (две строки «Test»):

Uri address = new Uri("http://localhost:8889/TestImage/Test/Test");

Я считаю, что имя метода является частью URL по умолчанию, поэтому шаблон будет применен после этого.

При ошибках HTTP я использую инструмент Fiddler для устранения неполадок. Если вы можете создать запрос, который работает с Компоновщиком запросов, то просто выясните, как создать этот запрос с помощью вашего кода.

0 голосов
/ 11 ноября 2010

Служба WCF, которую вы вызываете, ожидает, что передаваемая строка будет сериализована в XML!

В прошлом у меня работало следующее:

string body = "foo";
string postData = @"<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'><![CDATA[" + body + "]]></string>";
0 голосов
/ 11 ноября 2010

Не уверен, что это ответ на ваш вопрос - но у меня есть метод расширения, который я использовал для публикации формы:

    public static HttpWebResponse DoFormPost(this HttpWebRequest request, string postVals, int timeoutSeconds)
    {
        request.Method = "POST";
        request.Timeout = timeoutSeconds * 0x3e8;
        request.ContentType = "application/x-www-form-urlencoded";
        request.AllowAutoRedirect = false;
        byte[] bytes = Encoding.UTF8.GetBytes(postVals);
        request.ContentLength = bytes.Length;
        using (Stream stream = request.GetRequestStream())
        {
            stream.Write(bytes, 0, bytes.Length);
        }
        return (HttpWebResponse)request.GetResponse();
    }

Или, так как вы пометили WCF, есть еще один похожий вопрос:

Получение ошибки http 400 при вызове спокойной службы wcf с использованием http post

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