Использование данных формы при отправке услуги wcf по почте - PullRequest
6 голосов
/ 29 августа 2011

Я прочитал несколько статей об этом и обнаружил, что для того, чтобы wcf получал данные из почтового запроса, мы добавляем

[ServiceContract]
public interface IService1 {
  [OperationContract]
  [WebInvoke(
      Method = "POST",
      BodyStyle = WebMessageBodyStyle.Bare,
      UriTemplate = "/GetData")]
  void GetData(Stream data);
}

и в реализации

public string GetData( Stream input)
{
    long incomingLength = WebOperationContext.Current.IncomingRequest.ContentLength;
    string[] result = new string[incomingLength];
    int cnter = 0;
    int arrayVal = -1;
    do
    {
        if (arrayVal != -1) result[cnter++] = Convert.ToChar(arrayVal).ToString();
        arrayVal = input.ReadByte();
    } while (arrayVal != -1);

    return incomingLength.ToString();
}

Мой вопрос: что мне делать, чтобы при отправке действия в форме запрос отправлялся на мой сервис и потреблял?

В параметре Stream у меня будет информация о публикации из формы, которую я могу получить по запросу ["FirstName"]?

1 Ответ

12 голосов
/ 30 августа 2011

Ваш код неправильно декодирует тело запроса - вы создаете массив значений string, каждое из которых содержит один символ. После получения тела запроса вам необходимо проанализировать строку запроса (использование HttpUtility - это простой способ сделать это). Код ниже показывает, как правильно получить тело и одно из полей.

public class StackOverflow_7228102
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        [WebInvoke(
            Method = "POST",
            BodyStyle = WebMessageBodyStyle.Bare,
            UriTemplate = "/GetData")]
        string GetData(Stream data);
    }
    public class Service : ITest
    {
        public string GetData(Stream input)
        {
            string body = new StreamReader(input).ReadToEnd();
            NameValueCollection nvc = HttpUtility.ParseQueryString(body);
            return nvc["FirstName"];
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
        host.Open();
        Console.WriteLine("Host opened");

        WebClient c = new WebClient();
        c.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        Console.WriteLine(c.UploadString(baseAddress + "/GetData", "FirstName=John&LastName=Doe&Age=33"));

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...