Создайте изображение PNG с веб-сервисом C# HttpHandler

http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?r1=1069292&r2=1135026& diff_format = h

здесь я могу видеть, что тайм-аут был добавлен недавно

, убедитесь, что startTimeout> 0, иначе вы будете ждать (0) или ждать (-n) это вероятно причиной IllegalMonitorStateException

РЕДАКТИРОВАТЬ: ОК, выше, это катастрофа, но давайте попробуем это:

мы в конструкторе Mux: http://svn.apache.org /viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?view=markup

в строке 176 мы создаем SocketChannelConnectionIO и передаем это после этого мы сломать и и другая нить вступает во владение.

в конструкторе SocketChannelConnectionIO, определенном здесь: http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/SocketChannelConnectionIO. java? view = markup строка 112 мы регистрируем на канал с новым обработчиком ().

Обработчик возвращает что-то по каналу, и функция, скажем, выполняется функция handleReadReady, мы синхронизируемся по muxLock.

Теперь мы все еще в конструкторе, поэтому объект в финале все еще изменчив! давайте предположим, что это изменится, теперь у нас есть что-то, ожидающее на другом muxLock

Сценарий один на миллион

РЕДАКТИРОВАТЬ

http: // svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?revision=1135026&view=co

Mux(SocketChannel channel,
    int role, int initialInboundRation, int maxFragmentSize)
    throws IOException
    {
    this.role = role;
    if ((initialInboundRation & ~0x00FFFF00) != 0) {
        throw new IllegalArgumentException(
        "illegal initial inbound ration: " +
        toHexString(initialInboundRation));
    }
    this.initialInboundRation = initialInboundRation;
    this.maxFragmentSize = maxFragmentSize;

    //LINE BELOW IS CAUSING PROBLEM it passes this to SocketChannelConnectionIO
    this.connectionIO = new SocketChannelConnectionIO(this, channel);

    //Lets assume it stops here we are still in constructor
    //and we are not in synchronized block

    directBuffersUseful = true;
    }

теперь в конструкторе SocketChannelConnectionIO http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/SocketChannelConnectionIO.java?revision=1069292&view = co

SocketChannelConnectionIO(Mux mux, SocketChannel channel)
    throws IOException
{
    super(mux);
    channel.configureBlocking(false);
    this.channel = channel;
    //Line below we are registering to the channel with mux that is still mutable
    //this is the line that actually is causing the problem move that to 
    // start() and it should work 
    key = selectionManager.register(channel, new Handler());
}

переместить этот код в start () должно работать key = selectionManager.register(channel, new Handler()); (я предполагаю, что start is executet, когда мы хотим начать обработку)

/**
 * Starts processing connection data.
 */
void start() throws IOException {
    key = selectionManager.register(channel, new Handler());
    key.renewInterestMask(SelectionKey.OP_READ);
}

Но было бы намного лучше не создавать SocketChannelConnectionIO в конструкторе mux, но может быть где-то после этого то же самое для второго конструктора, создающего StreamConnectionIO с этим

13
задан Guy 22 May 2009 в 21:05
поделиться

5 ответов

Веб-сервисы, особенно SOAP, ожидают таких вещей, как XML-конверт с деталями вызова. Лучше использовать HttpHandler .

Что-то вроде this:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web;

public class ImageHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        int width = int.Parse(context.Request.QueryString["width"]);
        int height = int.Parse(context.Request.QueryString["height"]);

        using (Bitmap bitmap = new Bitmap(width,height)) {

            ...

            using (MemoryStream mem = new MemoryStream()) {
                bitmap.Save(mem,ImageFormat.Png);
                mem.Seek(0,SeekOrigin.Begin);

                context.Response.ContentType = "image/png";

                mem.CopyTo(context.Response.OutputStream,4096);
                context.Response.Flush();
            }
        }
    }

}

Это, конечно, очень грубо. Тогда вы бы назвали это:

<img src="myhandler.ashx?width=10&height=10"/>
21
ответ дан 1 December 2019 в 21:12
поделиться

Веб-служба для этого не подходит. Он возвращает сообщение в определенном формате, обычно SOAP, поэтому это не может быть изображение.

Вместо этого используйте обычную веб-форму, в которой вы удаляете всю разметку, кроме директивы @page . Используйте метод BinaryWrite для записи данных изображения в поток ответа.

Пример:

byte[] imageData;
using (Bitmap image = new Bitmap(10,10)) {
   using (Graphics g = Graphics.FromImage(image)) {
      g.Clear(Color.Red);
   }
   using (MemoryStream m = new MemoryStream()) {
      image.Save(m, ImageFormat.Png);
      imageData = m.ToArray();
   }
}
Response.ContentType = "image/png";
Response.BinaryWrite(imageData);
3
ответ дан 1 December 2019 в 21:12
поделиться

Я думаю, что ответ @Lloyd - хорошее начало.

У меня были проблемы с альфа-прозрачностью и PNG: Можно ли сделать альфа-прозрачный PNG с помощью C #?

2
ответ дан 1 December 2019 в 21:12
поделиться

Невозможно вывести изображение из WebService.

Проверьте это: http://www.c-sharpcorner.com/UploadFile/gnsrinivas1511/Webservice05112009034709AM/Webservice.aspx

0
ответ дан 1 December 2019 в 21:12
поделиться

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

0
ответ дан 1 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: